我可以将矩阵的单元格数组转换为矩阵:
>> 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
答案 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
我认为最后一个例子的正确结果应该是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函数不是一个好主意,我自己对我的解决方案非常可耻,但它确实有用。