8

Matlab では、次のように配列の次元全体を折りたたむことができます。

M     = rand(3,4,5);
myvec = M(:);        % gives a 60-element vector

シリアル化またはフラット化と呼ばれると思います。要素の順序は、dim1、dim2、dim3 の順です[M(1,1,1); M(2,1,1); M(3,1,1); M(1,2,1); ...]

しかし、私がやりたいのは、最初の 2 つの次元に沿って折りたたむことです。

mymatrix = M( :: , : ); % something that works like this?

12 x 5 のマトリックスを指定します。たとえば、次のようになります。

[M(1,1,1)  M(1,1,2)  M(1,1,3)  M(1,1,4)  M(1,1,5)
 M(2,1,1)  M(2,1,2)  M(2,1,3)  M(2,1,4)  M(2,1,5)
 M(3,1,1)  M(3,1,2)  M(3,1,3)  M(3,1,4)  M(3,1,5)
 M(1,2,1)  M(1,2,2)  M(1,2,3)  M(1,2,4)  M(1,2,5)
 ...
]

の最初の次元mymatrixは、元の の 1 番目と 2 番目の次元を「平坦化」しMますが、他の次元は保持します。

私は実際に5次元配列の「中間3次元」に対してこれを行う必要があるので、一般的な解決策は素晴らしいでしょう! たとえば、私が何を意味するかがわかればW=rand(N,N,N,N,N); mymatrix = W( :, :::, : )、行列を与える必要があります。N x N^3 x N

ありがとう

4

1 に答える 1

5

次元の長さの引数の 1 つのプレースホルダーとして、reshape角かっこ ( ) と共に使用します。[]

sz = size( M );
mymatrix = reshape( M, [], sz(end) );        % # Collapse first two dimensions

また

mymatrix = reshape( M, sz(1), [], sz(end) ); % # Collapse middle dimensions

プレースホルダーは、サイズを自動的に計算するように[]指示します。reshapeを 1 回だけ使用できることに注意してください[]。他のすべての次元の長さは、明示的に指定する必要があります。

于 2013-06-24T12:58:47.320 に答える