我有一个巨大的4D矩阵,我需要将其切割成2D矩阵。一个接一个地手动执行此操作很容易:
a.reshape(-1,a.shape[-1])
等 但是我无法使用循环来解决这个问题。到目前为止,我所看到的一切都重塑了原始矩阵(我不想要)。
答案 0 :(得分:1)
您只需使用一对for
循环,并让两个访问变量访问您想要的正确切片 1 :
for ii = 1 : size(fourDMatrix, 3)
for jj = 1 : size(fourDMatrix, 4)
slice = fourDMatrix(:, :, ii, jj);
% Do your processing here...
end
end
但是,如果我建议使用reshape
,您应该使用它。您可以使用reshape
创建一个3D矩阵,其中每个切片都是来自您的4D矩阵的2D切片,您只需执行以下操作:
slices = reshape(fourDMatrix, size(fourDMatrix, 1), size(fourDMatrix,2), []);
这将创建一个3D矩阵,其中行和列等于4D矩阵中的行和列。但是,代码末尾的[]
将自动展开您的4D矩阵,以便它首先沿第三个维度发生,然后是第四个维度。它基本上决定了3D矩阵中有多少2D切片,这将自动计算。例如,如果您的4D矩阵被称为A
且大小为9 x 9 x 4 x 4
,则上述代码将创建9 x 9 x 16
矩阵,其中slices(:,:,1)
对应A(:,:,1,1)
,{ {1}}对应slices(:,:,2)
,A(:,:,2,1);
对应slices(:,:,6)
。通常,A(:,:,2,2)
会访问slices(:,:,kk)
处的切片。
1:变量名不能以MATLAB中的数字开头。我已将您的变量重命名为A(:,:,floor(kk/size(A,2)) + 1, mod(kk,size(A,2)) + 1
。