获取3D矩阵的Y-Z维数据

时间:2014-08-14 09:54:27

标签: matlab

我有一个尺寸为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矩阵。如何解决我的问题。非常感谢你

2 个答案:

答案 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。