假设
我通常希望将这样的单元数组转换为一个新的单元数组
我使用以下代码实现此功能。
C
是形状为 M × 1 的单元数组(即,size(C)
返回 [M 1]),并且每个 C
中的元素反过来又是一个形状为 1 × N 的单元数组。我通常希望将这样的单元数组转换为一个新的单元数组
D
,其形状为 1 × N,其中元素是形状为 M × 1 的单元数组,且对于所有的 0 < i ≤ M 和 0 < j ≤ N,C{i}{j}
等于 D{j}{i}
。我使用以下代码实现此功能。
D = arrayfun(@(j) arrayfun(@(i) C{i}{j}, (1:M)', 'un', 0), 1:N, 'un', 0);
尽管需要进行这种操作的频率相当高(毕竟它有点像“单元数组转置”),但我认为我应该问一下:
是否有更标准的方法来执行此操作?
请注意,所需的 D
与其他情况下不同。
E = cat(2, C{:});
或者等价地说,
E = cat(1, D{:});
E
是一个二维(M × N)的单元格数组,而C
和D
都是由一维单元格数组构成的一维单元格数组。当然,将E
转换回C
或D
也是另一个经常需要进行的操作(这种事情在MATLAB中永远不会停止),但我会在另一篇文章中讨论它。
这个问题背后的动机远不止上述问题。事实证明,我的MATLAB代码中有很大一部分,甚至更大的部分我的MATLAB编程时间和精力,都被用于这种基本上无用的数据格式转换工作。当然,在进行任何类型的计算工作时,格式转换是不可避免的,但是我发现在MATLAB中,我做得更多,或者说要花费更多的精力去处理,比起在其他系统(例如Mathematica或Python/NumPy)中工作时要多得多。我希望通过建立我的MATLAB“格式转换技巧”库,能够将我必须专注于格式转换的MATLAB编程时间的占比降至更为合理的水平。
P.S.以下代码构造了一个像上面描述的C
,对于M = 5和N = 2。
uc = ['A':'Z'];
randstr = @() uc(randi(26, [1 4]));
M = 5;
rng(0); % keep example reproducible
C = arrayfun(@(i) {randstr() i}, 1:M, 'un', 0)';
% C =
% {1x2 cell}
% {1x2 cell}
% {1x2 cell}
% {1x2 cell}
% {1x2 cell}
% >> cat(1, C{:});
% ans =
% 'VXDX' [1]
% 'QCHO' [2]
% 'YZEZ' [3]
% 'YMUD' [4]
% 'KXUY' [5]
%
N = 2;
D = arrayfun(@(j) arrayfun(@(i) C{i}{j}, (1:M)', 'un', 0), 1:N, 'un', 0);
% D =
% {5x1 cell} {5x1 cell}
C
转置为一个包含五个2x1单元格的1x5单元格吗?也许需要使用不同的数据结构。也许可以考虑使用struct
? - horchler