Matlab 如何将一个3D矩阵转换为多个2D矩阵?

Matlab 如何将一个3D矩阵转换为多个2D矩阵?,matlab,mat-file,Matlab,Mat File,mat文件是一个156*192*25的3D矩阵。数据是mat文件中的一系列n=25个图像。如何将此3D矩阵转换为25个2D矩阵并独立显示?感谢~使用该命令,您可以将3D值矩阵转换为25个单元格的数组,其中每个单元格包含一个156x1922D值矩阵: M = rand(156,192,25); %// simulate your 3D data matrix Mcell = mat2cell(M,156,192,ones(1,25)); 或者,使用以下命令: 您现在可以通过以下方式逐个访

mat文件是一个156*192*25的3D矩阵。数据是mat文件中的一系列n=25个图像。如何将此3D矩阵转换为25个2D矩阵并独立显示?感谢~

使用该命令,您可以将3D值矩阵转换为
25个
单元格的数组,其中每个单元格包含一个
156x192
2D值矩阵:

M = rand(156,192,25);   %// simulate your 3D data matrix

Mcell = mat2cell(M,156,192,ones(1,25));
或者,使用以下命令:


您现在可以通过以下方式逐个访问
25
图像:

imageNum = 5;            %// example: access image num. 5
image = Mcell{imageNum}; %// image: 156x192 value matrix
将图像保留在单元格数组中的一个好处是,您可以轻松地将相同的过滤器应用于所有图像,使用命令,例如:

h = fspecial('motion', 50, 45);
McellFiltered = cellfun(@(x) imfilter(x, h), Mcell, ...
  'UniformOutput', false);
使用该命令,您可以将3D值矩阵转换为
25
单元格的数组,其中每个单元格包含一个
156x192
2D值矩阵:

M = rand(156,192,25);   %// simulate your 3D data matrix

Mcell = mat2cell(M,156,192,ones(1,25));
或者,使用以下命令:


您现在可以通过以下方式逐个访问
25
图像:

imageNum = 5;            %// example: access image num. 5
image = Mcell{imageNum}; %// image: 156x192 value matrix
将图像保留在单元格数组中的一个好处是,您可以轻松地将相同的过滤器应用于所有图像,使用命令,例如:

h = fspecial('motion', 50, 45);
McellFiltered = cellfun(@(x) imfilter(x, h), Mcell, ...
  'UniformOutput', false);

我建议不要分割图像堆栈,如果您需要第三个图像,只需使用
I(:,:,3)

要显示可以使用的图像,请执行以下操作:

montage(permute(I,[1,2,4,3]))
将所有图像显示在一起。之所以需要排列,是因为
蒙太奇
需要
156*192*1*25
对于堆叠的灰度图像,第三维是为彩色通道保留的。或者,要显示单个图像,请使用:

imshow(I(:,:,3));
要将每个图像保存到单个mat文件,请使用:

for ix=1:size(I,3)
   M=matfile(sprintf('image%03d',ix),'writable',true);
   M.image=I(:,:,ix);
end

我建议不要分割图像堆栈,如果您需要第三个图像,只需使用
I(:,:,3)

要显示可以使用的图像,请执行以下操作:

montage(permute(I,[1,2,4,3]))
将所有图像显示在一起。之所以需要排列,是因为
蒙太奇
需要
156*192*1*25
对于堆叠的灰度图像,第三维是为彩色通道保留的。或者,要显示单个图像,请使用:

imshow(I(:,:,3));
要将每个图像保存到单个mat文件,请使用:

for ix=1:size(I,3)
   M=matfile(sprintf('image%03d',ix),'writable',true);
   M.image=I(:,:,ix);
end

你已经有25个2D矩阵了!您可以使用
varname(:,:,n)
调用第n个变量。。。对细胞阵列等进行施法是没有用的!如果其中一个答案已经解决了你的问题,请通过点击复选标记来考虑。这表明您已经找到了解决方案,这不再是一个悬而未决的问题。如果您的问题没有得到回答,请解释缺少的内容。您已经有25个2D矩阵了!您可以使用
varname(:,:,n)
调用第n个变量。。。对细胞阵列等进行施法是没有用的!如果其中一个答案已经解决了你的问题,请通过点击复选标记来考虑。这表明您已经找到了解决方案,这不再是一个悬而未决的问题。如果您的问题没有得到回答,请解释缺失的内容。非常感谢~我可以使用I(:,:,t)获取当前的x-y 2D数据~此外,我想在for循环期间将这些2D数据保存在不同的独立mat文件中(用于不同的堆栈)。那么,您能否就如何在for循环期间将当前2D数据保存在mat文件中提出一些建议?我更新了我的答案,但在使用它之前,您真的需要分割数据集吗?使用
matfile
还可以将所有数据保存在一个文件中,只加载相关部分。非常感谢~我可以使用I(:,:,t)获取当前的x-y 2D数据~此外,我想在for循环期间将这些2D数据保存在不同的独立mat文件中(用于不同的堆栈)。那么,您能否就如何在for循环期间将当前2D数据保存在mat文件中提出一些建议?我更新了我的答案,但在使用它之前,您真的需要分割数据集吗?使用
matfile
还可以将所有数据保存在一个文件中,并仅加载相关部分。