2016-10-21 43 views
2

私はサイズKxNxZの3D行列を持っています。 3次元のサブ行列をサイズK * ZxN、s.tの単一の2D行列に連結したいと思います。それらは行で連結されます。 この結果を得る最も良い方法は何ですか?MATLAB - 3番目の行列次元の連結

ありがとうございます!

例:

%generates input 
M = cat(3,[(1:3)',(4:6)'],[(7:9)',(10:12)'],[(13:15)',(16:18)']); 
DesiredOutput = [[(1:3)';(7:9)';(13:15)'],[(4:6)';(10:12)';(16:18)']]; 

入力行列

M(:,:,1) = 
1  4 
2  5 
3  6 

M(:,:,2) = 
7 10 
8 11 
9 12 

M(:,:,3) = 
13 16 
14 17 
15 18 

所望の出力マトリックス:

DesiredOutput = 

1  4 
2  5 
3  6 
7 10 
8 11 
9 12 
13 16 
14 17 
15 18 
+0

私は、あなたが 'reshape'と' permute'関数を見て、それらを少し演奏することをお勧めします。あなたはあなたが探している結果を得ることができるはずです:) – Eskapp

答えて

4

Eskappが正しい軌道に乗っています。最初にpermuteを使用して、K x Z x N行列を得るように2番目と3番目の次元を入れ替えます。これを実行したらreshapeを使用して行列を展開して、サイズがそれぞれK x Zの各2Dスライスを取り出し、2Dスライスの各列が展開されるように単一の1つの列に変換します。ありがたいことに、MATLABが行列を再構成するときにMATLABがどのように動作するのかが分かります。次に、これらの列をすべて連結してマトリックスを作成します。

あなたが最初に使用permuteこの方法は:

Mp = permute(M, [1 3 2]); 

これは第二と第三の次元を入れ替えたいことを教えてくれる。次に、この行列にreshapeを使用して、各列にK x Zの要素があることを確認します。ここでは、2Dスライスの各列が単一の列に展開されます。

DesiredOutput = reshape(Mp, [], size(M,2)); 

size(M,2)は元の行列中Nの値にアクセスします。したがって、DesiredOutputには、K*Zの行とNの列があります。 []を実行すると、自動的に出力マトリクスの行数が推定されます。

私たちは、このように取得する:あなたは、一時的な変数を使用しない場合

>> DesiredOutput 

DesiredOutput = 

    1  4 
    2  5 
    3  6 
    7 10 
    8 11 
    9 12 
    13 16 
    14 17 
    15 18 

我々は次のように1つのステートメントにすべてのものを組み合わせることができます。

DesiredOutput = reshape(permute(M, [1 3 2]), [], size(M,2)); 

私は主にプロセスの各ステップを説明するために一時変数を使用しました。

関連する問題