8

我可以将矩阵的单元格数组转换为矩阵:

>> C={[1,1]; [2,2]; [3,3]};
>> cell2mat(C)
ans =
     1     1
     2     2
     3     3

还行吧。但是,我想将包含其他单元格数组的单元格数组转换为矩阵:

>> C={{1,1}; {2,2}; {3,3}};    
>> cell2mat(C)
Error using cell2mat (line 53)
Cannot support cell arrays containing cell arrays or objects.

因此,所需的输出是:

>> mycell2mat({{1,1}; {2,2}; {3,3}})
ans =
     1     1
     2     2
     3     3

这个怎么做?

编辑:

我也想为多维做同样的事情:

>> 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
4

5 回答 5

10

老实说,我从不喜欢cell2mat慢,所以我想出了一个使用逗号分隔列表的替代解决方案!

转换向量元胞数组

这相当简单,只需使用冒号运算符并垂直连接所有向量

C = {[1,1]; [2,2]; [3,3]};
A = vertcat(C{:})

所以我们得到:

A =
    1   1
    2   2
    3   3

转换元胞数组的元胞数组

这有点棘手。由于它是元胞数组的元胞数组,因此我们必须通过两次使用冒号和 来获得所有元素的向量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)

所以我们得到:

A =
    1   1
    2   2
    3   3

的操作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

附言

我认为最后一个示例的正确结果应该是 6×2 矩阵,而不是 2×2×3。但是,这不是您要求的,所以它是题外话。

于 2012-11-24T15:18:07.980 回答
5

这应该可以解决问题:

cellOfCells = {{1,1}; {2,2}; {3,3}};
cell2mat(cellfun(@cell2mat, cellOfCells, 'UniformOutput', false))

编辑:

我同意保持简单很重要,但玩得开心也很重要 :) 所以 - 这是一个可以解决问题的单行代码(并且可以很容易地推广到任何大小):

a = {{1,1;1,1}; {2,2;2,2}; {3,3;3,3}}
reshape(cell2mat(cellfun(@cell2mat,a, 'UniformOutput', false))', 2, 2, 3)
于 2012-11-24T10:50:56.113 回答
3

把事情简单化

c = {{1,1;1,1}; {2,2;2,2}; {3,3;3,3}};
z = zeros([size(c{1}) size(c,1)]);

for i=1:size(c,1)
    z(:,:,i)=cell2mat(c{i});
end

EDU>> z    
z(:,:,1) =

     1     1
     1     1

z(:,:,2) =

     2     2
     2     2    

z(:,:,3) =

     3     3
     3     3
于 2012-11-24T12:27:26.467 回答
2

好的,这个问题是很久以前的问题了 - 但也许我的回答可能会帮助其他读者或搜索者。
我认为最好的解决方案几乎是Eitan T提出的想法,但可以在不重塑的情况下做到这一点。为了我

C={{1,1;1,1};{2,2;2,2};{3,3;3,3}};
A=cell2mat(cat(3,C{:}))

做所要求的 - 因此回答

A(:,:,1) =
     1     1
     1     1
A(:,:,2) =
     2     2
     2     2
A(:,:,3) =
     3     3
     3     3

希望有帮助。

于 2013-05-08T06:16:36.363 回答
1

我有同样的错误,我只是注释掉了 cell2mat 中返回错误的行,一切对我来说都很好。

在 cell2mat (51:53) 中注释掉的行:(如果出现错误,您可以使用 dbstop 找到它们)

如果 cisobj || ciscell错误(消息('MATLAB:cell2mat:UnsupportedCellContent'));结尾

我认为更改 matlab 函数不是一个好主意,而且我自己对我的解决方案感到非常可耻,但它确实有效。

于 2014-11-17T12:13:24.707 回答