我有一個巨大的4維矩陣,我需要將它切成2D矩陣。這很容易逐個手動做到這一點:將4D矩陣切成2D切片MatLab
slice1 = 4dmatrix(:,:,1,1)
slice2 = 4dmatrix(:,:,1,2)
等 但我不知道如何使用循環來做到這一點。目前爲止我看到的所有東西都重塑了原始矩陣(我不想)。
我有一個巨大的4維矩陣,我需要將它切成2D矩陣。這很容易逐個手動做到這一點:將4D矩陣切成2D切片MatLab
slice1 = 4dmatrix(:,:,1,1)
slice2 = 4dmatrix(:,:,1,2)
等 但我不知道如何使用循環來做到這一點。目前爲止我看到的所有東西都重塑了原始矩陣(我不想)。
你可以簡單地只使用一對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
。
那你到底想要什麼?你想創建一個3D矩陣,其中每個切片是這個4D矩陣的2D切片?什麼是期望的輸出? – rayryeng
只需在循環'D4matrix(:,:,ii,jj)'這裏循環指定'ii'和'jj'。不要單獨創建所有2D切片,這就是所謂的[動態變量命名](http://stackoverflow.com/questions/32467029/how-to-put-these-images-together/32467170#32467170),並被認爲是糟糕的編程習慣。另外:你實際上不能命名你的矩陣'4dmatrix',因爲變量名不能以數字開頭。 – Adriaan