我可以将矩阵的单元格数组转换为矩阵:
>> C={[1,1]; [2,2]; [3,3]};
>> cell2mat(C)
ans =
1 1
2 2
3 3
Run Code Online (Sandbox Code Playgroud)
还行吧.但是,我想将包含其他单元格数组的单元格数组转换为矩阵:
>> C={{1,1}; {2,2}; {3,3}};
>> cell2mat(C)
Error using cell2mat (line 53)
Cannot support cell arrays containing cell arrays or objects.
Run Code Online (Sandbox Code Playgroud)
所以,期望的输出是:
>> mycell2mat({{1,1}; {2,2}; {3,3}})
ans =
1 1
2 2
3 3
Run Code Online (Sandbox Code Playgroud)
这该怎么做?
我也想对多维的做同样的事情:
>> mycell2mat({{1,1;1,1}; {2,2;2,2}; {3,3;3,3}})
ans(:,:,1) =
1 1
1 1
ans(:,:,2) =
2 2
2 2
ans(:,:,3) =
3 3
3 3
Run Code Online (Sandbox Code Playgroud)
Eit*_*n T 10
说实话,我从不喜欢cell2mat
慢,所以我提出了另一种使用逗号分隔列表的解决方案!
C = {[1,1]; [2,2]; [3,3]};
A = vertcat(C{:})
Run Code Online (Sandbox Code Playgroud)
所以我们得到:
A =
1 1
2 2
3 3
Run Code Online (Sandbox Code Playgroud)
这有点棘手.由于它是细胞阵列的细胞阵列,我们必须通过双重使用冒号获得所有元素的向量horzcat
,然后将reshape
其转换为所需的矩阵.
C = {{1,1}; {2,2}; {3,3}};
V = [size(C{1}), 1]; V(find(V == 1, 1)) = numel(C);
A = reshape([horzcat(C{:}){:}], V)
Run Code Online (Sandbox Code Playgroud)
所以我们得到:
A =
1 1
2 2
3 3
Run Code Online (Sandbox Code Playgroud)
操作V
确保A
正确地重新整形而不必明确指定输出尺寸(不幸的是,我没有为此找到一个衬垫).这也适用于多维单元阵列:
C = {{1, 1; 1, 1}; {2, 2; 2, 2}; {3, 3; 3, 3}};
V = [size(C{1}), 1]; V(find(V == 1, 1)) = numel(C);
A = reshape([horzcat(C{:}){:}], V)
A(:,:,1) =
1 1
1 1
A(:,:,2) =
2 2
2 2
A(:,:,3) =
3 3
3 3
Run Code Online (Sandbox Code Playgroud)
我认为最后一个例子的正确结果应该是6乘2矩阵而不是2乘2乘3.但是,这不是你要求的,所以它是偏离主题的.
这应该做的伎俩:
cellOfCells = {{1,1}; {2,2}; {3,3}};
cell2mat(cellfun(@cell2mat, cellOfCells, 'UniformOutput', false))
Run Code Online (Sandbox Code Playgroud)
编辑:
我同意保持简单是一个重要的,但乐趣也是如此:)所以 - 这是一个应该做的技巧(并且可以很容易地推广到任何大小):
a = {{1,1;1,1}; {2,2;2,2}; {3,3;3,3}}
reshape(cell2mat(cellfun(@cell2mat,a, 'UniformOutput', false))', 2, 2, 3)
Run Code Online (Sandbox Code Playgroud)