Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何将{1xN cell}数组的{Mx1}单元格数组转换为{Mx1 cell}数组的{1xN}单元格数组?_Matlab_Cell Array - Fatal编程技术网

Matlab 如何将{1xN cell}数组的{Mx1}单元格数组转换为{Mx1 cell}数组的{1xN}单元格数组?

Matlab 如何将{1xN cell}数组的{Mx1}单元格数组转换为{Mx1 cell}数组的{1xN}单元格数组?,matlab,cell-array,Matlab,Cell Array,假设C是形状为M×1的单元数组(即size(C)返回[M1]),并且C的每个元素依次是形状为1×N的单元数组 我经常想把这样一个单元数组转换成一个新的单元数组D具有1×N的形状,元素是具有M×1形状的单元数组,这样C{I}{j}等于D{j}{I}对于所有0这里有一个小技巧,这实际上适用于单元阵列输入–关键是首先将C扩展为5×2单元阵列(相当于cell(5,2)) 或者更简单地说 D = num2cell(cat(1,C{:}),1) 其中D{:}返回: ans = 'VXDX'

假设
C
是形状为M×1的单元数组(即
size(C)
返回[M1]),并且
C
的每个元素依次是形状为1×N的单元数组


我经常想把这样一个单元数组转换成一个新的单元数组
D
具有1×N的形状,元素是具有M×1形状的单元数组,这样
C{I}{j}
等于
D{j}{I}
对于所有0这里有一个小技巧,这实际上适用于单元阵列输入–关键是首先将
C
扩展为5×2单元阵列(相当于
cell(5,2)

或者更简单地说

D = num2cell(cat(1,C{:}),1)
其中
D{:}
返回:

ans = 

    'VXDX'
    'QCHO'
    'YZEZ'
    'YMUD'
    'KXUY'


ans = 

    [1]
    [2]
    [3]
    [4]
    [5]
D
返回
C
的反向操作可通过以下方式完成:

% C = num2cell(reshape([D{:}],[N M]),[M N])
C = num2cell(reshape([D{:}],[size(D{1},1) size(D,2)]),[size(D,2) size(D{1},1)])

因此,您可以创建一个类似于以下的函数,该函数可以在任意方向工作:

transpose_cells = @(C)num2cell(cat(isrow(C)+1,C{:}),isrow(C)+1);
isequal(transpose_cells(transpose_cells(C)),C)

+1用于制定良好的答案和可复制的代码。我不认为双
arrayfun
方法是一种很好的方法monstrosity@LuisMendo:想象一下,如果你每次需要矩阵转置时都要写这样的东西。这对我来说是个怪物,因为我经常需要这个手术。当然,我可能能够编写一个函数来简化操作,但在执行此操作之前,我想问一下是否已经有合适的内置替代方案。@kjo:这只是一个中间步骤,而您的实际问题是如何将单元格数组
C
转换为包含五个2-by-1单元格的1-by-5单元格?也可能需要一种不同的数据结构。也许是一个
struct
?@horchler:正如我在小字本中所说,这是一种反复出现的情况;它出现在许多不同的环境中。在早些时候,你提到的换位问题可能就是这种情况之一,但现在不是这样。@kjo我同意你的看法。但是细胞阵列的细胞阵列是一个稍微复杂的结构,所以在我看来,需要如此复杂的表达式来“转置”它是正常的。这不是转置,更重要的是把它翻过来,可以这么说。如果使用二维单元阵列而不是嵌套单元阵列,则可以简单地使用Transpose
% Your example to produce C
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)';

% D = num2cell(reshape([C{:}],[N M]).',[1 M])
D = num2cell(reshape([C{:}],[size(C{1},2) size(C,1)]).',[1 size(C,1)])
D = num2cell(cat(1,C{:}),1)
ans = 

    'VXDX'
    'QCHO'
    'YZEZ'
    'YMUD'
    'KXUY'


ans = 

    [1]
    [2]
    [3]
    [4]
    [5]
% C = num2cell(reshape([D{:}],[N M]),[M N])
C = num2cell(reshape([D{:}],[size(D{1},1) size(D,2)]),[size(D,2) size(D{1},1)])
C = num2cell(cat(2,D{:}),2)
transpose_cells = @(C)num2cell(cat(isrow(C)+1,C{:}),isrow(C)+1);
isequal(transpose_cells(transpose_cells(C)),C)