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

mmd*_*bas 8 matlab

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

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

PS

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


Ron*_*yle 5

这应该做的伎俩:

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)