将单元阵列的单元阵列转换为矩阵矩阵

时间:2012-11-24 10:40:49

标签: matlab

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

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

5 个答案:

答案 0 :(得分:9)

说实话,我从不喜欢cell2mat因为速度慢,所以我提出了使用comma-separated lists的替代解决方案!

转换向量的单元格数组

这很简单,只需使用colon运算符和concatenate all vectors vertically

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

P.S

我认为最后一个例子的正确结果应该是6乘2矩阵而不是2乘2乘3。但是,这不是你要求的,所以它是偏离主题的。

答案 1 :(得分: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)

答案 2 :(得分: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

答案 3 :(得分: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

希望有所帮助。

答案 4 :(得分:1)

我有同样的错误,我只是注释掉了cell2mat中返回错误的行,一切正常。

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

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

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