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を使用する代替ソリューションを考え出しました!

ベクトルの cell 配列を変換する

これはかなり単純です。コロン演算子を使用して、すべてのベクトルを垂直に連結するだけです。

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

したがって、次のようになります。

A =
    1   1
    2   2
    3   3

cell 配列の cell 配列を変換する

これは少しトリッキーです。これはセル配列のセル配列であるため、コロンと を二重に使用してすべての要素のベクトルを取得し、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されます (残念ながら、これについては 1 つのライナーが見つかりませんでした)。これは、多次元セル配列にも機能します。

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

PS

最後の例の正しい結果は、2 x 2 x 3 ではなく 6 x 2 の行列になるはずです。ただし、それはあなたが要求したものではないため、トピックから外れています。

于 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 に答える
1

同じエラーが発生しました。エラーを返す cell2mat の行をコメントアウトしただけで、すべて正常に動作します。

cell2mat でコメントアウトする行 (51:53): (エラーの場合は dbstop を使用して見つけることができます)

cisobj の場合 || ciscell error(message('MATLAB:cell2mat:UnsupportedCellContent')); 終わり

私は、matlab 関数を変更するのは良い考えではないと思います。私自身の解決策はかなり恥ずべきことですが、うまくいきます。

于 2014-11-17T12:13:24.707 に答える