2016-10-21 136 views
2

我有一個大小爲KxNxZ的3D矩陣。 我想將第三維中的子矩陣連接成一個大小爲K * ZxN,s.t的單個二維矩陣。它們將按行連接起來。 達到這個結果的最好方法是什麼?MATLAB - 第三矩陣維度的連接

謝謝!

實施例:

%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矩陣。一旦你這樣做了,你可以使用reshape來展開矩陣,這樣就可以獲取尺寸爲K x Z的每個2D切片,並將其轉換爲單個列,2D切片的每一列都將展開。值得慶幸的是,這是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 

我們可以用下面的一切都結合到一個語句,如果你不希望使用一個臨時變量。

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

我主要使用一個臨時變量來解釋過程中的每個步驟。