2016-10-20 178 views
0

我有一個巨大的4維矩陣,我需要將它切成2D矩陣。這很容易逐個手動做到這一點:將4D矩陣切成2D切片MatLab

slice1 = 4dmatrix(:,:,1,1) 
slice2 = 4dmatrix(:,:,1,2) 

等 但我不知道如何使用循環來做到這一點。目前爲止我看到的所有東西都重塑了原始矩陣(我不想)。

+0

那你到底想要什麼?你想創建一個3D矩陣,其中每個切片是這個4D矩陣的2D切片?什麼是期望的輸出? – rayryeng

+3

只需在循環'D4matrix(:,:,ii,jj)'這裏循環指定'ii'和'jj'。不要單獨創建所有2D切片,這就是所謂的[動態變量命名](http://stackoverflow.com/questions/32467029/how-to-put-these-images-together/32467170#32467170),並被認爲是糟糕的編程習慣。另外:你實際上不能命名你的矩陣'4dmatrix',因爲變量名不能以數字開頭。 – Adriaan

回答

1

你可以簡單地只使用一對for循環,並有兩個接入變量訪問正確的切片你想:

for ii = 1 : size(fourDMatrix, 3) 
    for jj = 1 : size(fourDMatrix, 4) 
     slice = fourDMatrix(:, :, ii, jj); 
     % Do your processing here... 
    end 
end 

但是,如果我可以推薦使用reshape,你應該使用它。您可以使用reshape創建一個三維矩陣,其中的這每片是從四維矩陣二維切片,和你簡單地做:

slices = reshape(fourDMatrix, size(fourDMatrix, 1), size(fourDMatrix,2), []); 

這將創建一個三維矩陣,其中的行和列等於那些來自您的4D矩陣。但是,代碼末尾的[]會自動展開您的4D矩陣,以便它先發生在第三維上,之後發生在第四維上。它基本上決定了3D矩陣中有多少個2D切片,並且會自動計算。例如,如果你的四維矩陣被稱爲A並有大小9 x 9 x 4 x 4,上面的代碼將創建一個9 x 9 x 16矩陣,其中slices(:,:,1)對應A(:,:,1,1)slices(:,:,2)對應A(:,:,2,1);slices(:,:,6)相當於A(:,:,2,2)。通常,slices(:,:,kk)將訪問切片A(:,:,floor(kk/size(A,2)) + 1, mod(kk,size(A,2)) + 1


1:變量名稱不能以MATLAB中的數字開頭。我已將您的變量重命名爲fourDMatrix

+1

謝謝,我認爲我誤解了文檔重塑,這正是我想要的。 – emmetbug

+0

完全沒問題。我很高興我能幫上忙!我還添加了幾句關於「重塑」的句子以避免混淆。這可能有助於您進一步瞭解它的工作原理。 – rayryeng