我有一个尺寸为120x256x256
的3D矩阵,其中120是切片数,256x256是每个图像切片的大小。我想将3D矩阵提取到2D图像(256x256)。如何获取3D矩阵的数据。我尝试使用matlab代码:
Img_3D=zeros(120,256,256);
for numSlice=1:120
Img2D=Img_3D(numSlice,:,:);
end
但它不起作用。它返回一个大小为1x256x256
的矩阵,而不是256x256
矩阵。如何解决我的问题。非常感谢你
答案 0 :(得分:2)
只需squeeze
生成的矩阵即可获得所需内容。
Img_3D=zeros(120,256,256);
for numSlice = 120:-1:1 %// backwards for preallocation
slices{numSlice } = squeeze( Img_3D(numSlice,:,:) );
end
使用permute
建议基本相同
for numSlice = 120:-1:1 %// backwards for preallocation
slices{numSlice } = permute( Img_3D(numSlice,:,:),[2 3 1] );
end
表现明智相等。
经过一段时间后,如果你提前permute
,它似乎并不重要:
Img_3D = permute(Img_3D,[2 3 1]);
for numSlice = 120:-1:1 %// backwards for preallocation
slices{numSlice } = Img_3D(numSlice,:,:);
end
答案 1 :(得分:1)
使用squeeze()当然可以解决这个问题,这是删除单例维度的最简单方法。 squeeze()通过相应地调用reshape()来检测单个维度并删除它们(它们)。如果速度是一个问题,你可以自己使用reshape()加速它,节省一些计算:
Img_3D=reshape(1:120*256*256, [120,256,256]);
t0 = tic;
for j = 1:100
for numSlice = 120:-1:1 %// backwards for preallocation
slices_squeeze{numSlice } = squeeze( Img_3D(numSlice,:,:) );
end
end
t_squeeze = toc(t0);
t0 = tic;
for j = 1:100
for numSlice = 120:-1:1 %// backwards for preallocation
slices_reshape{numSlice } = reshape(Img_3D(numSlice,:,:),[256, 256]);
end
end
t_reshape = toc(t0);
fprintf('squeeze-solution: %5.3f seconds\n', t_squeeze);
fprintf('reshape-solution: %5.3f seconds\n', t_reshape);
虽然加速并不是太多......
squeeze-solution: 5.654 seconds
reshape-solution: 4.790 seconds
Best,Nras。