2013-06-24 7 views
6

は、我々はこのような配列の次元を越え折りたたむことができます:特定のディメンションセット全体で配列を折りたたむ方法は? 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次元に沿って崩壊である:12×5行列を与えるために

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

mymatrixの最初の次元は、元Mの第一及び第二の寸法を「フラット化」が、他の寸法を維持するように、したがって、たとえば、あなたが

[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) 
... 
] 

を取得します。

私は実際には5次元配列の「中間3次元」のためにこれを行う必要があるので、一般的な解決策は素晴らしいでしょう!例えばW=rand(N,N,N,N,N); mymatrix = W(:, :::, :)N x N^3 x Nの行列を与えるはずです。寸法の長さ引数の一つのプレースホルダとして角括弧([])と

おかげ

答えて

5

使用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つだけ使用できます。他のすべての寸法の長さは明示的に指定する必要があります。

+0

ありがとうございます!形の変更を考えていたはずです。 PS私はちょうど動作するように見える別の方法を考えました: 'tmp = permute(M、[1,5,2,3,4]);'、 'mymatrix = tmp(:、:)'それがいつも動くかどうか分からない?もちろん、「改造」は**多くの方が好まれます**。 –

関連する問題