将 Matlab 单元格元素合并为单个向量
Combine Matlab cell elements to a single vector
我有 3 480 行 x 640 列图像。每个像素都有一个强度值。
我在 matlab 中用这个阅读它们:
object_intensities = cell(1,6);
for pat=1:3
file1 = sprintf('image%d.pgm',pat-1);
dummy = double(imread(file1));
object_intensities{pat} = dummy;
end
现在,对于 pat = 1 到 3,object_intensities 是一个元胞数组,使得 object_intensities{pat} 的每个元胞元素都包含 480x640 矩阵数组中的每个图像。
现在我需要的是一个 480 行 x 640 列的单一结构,这样每个单元格元素都包含单个向量中每个图像像素的 3 个强度,如下所示:
structure{row 1, column 1} = [image1_intensity @ row1 column1 image2_intensity @ row1 column1 image3_intensity @ row1 column1]
structure{row 1, column2} = [image1_intensity @ row1 column2 image2_intensity @ row1 column2 image3_intensity @ row1 column2]
.
.
structure{row 480, column 640} = [image1_intensity @ row480 column640 image2_intensity @ row480 column640 image3_intensity @ row480 column640]
有什么方法可以不使用循环而是通过向量化来做到这一点吗?
你要的数据结构是自找麻烦。而是使用 3D 矩阵,其中三维映射您的强度(按顺序)。下线工作会容易得多。
我建议你这样创建它:
object_intensities = zeros(480,640,3);
for pat=1:3
file1 = sprintf('image%d.pgm',pat-1);
object_intensities(:,:,pat) = rgb2gray(imread(file1));
end
现在在你的结构中 object_intensities{i,j}
只是 object_intensities(i,j,:)
如果你真的需要你可以调用 squeeze
或 permute
或 (:)'
使其成为行向量。但是想想现在做一些事情是多么容易,比如找到每个像素的平均强度
mean(object_intensities,3)
与元胞数组相比
cellfun(@mean,object_intensities,'uni',0) %// Just a loop in disguise
如果你想要每行的平均值怎么办
mean(object_intensities,2)
尝试对元胞数组执行此操作,您就会明白为什么要避免它。
但是如果你真的想要你的结构,那么使用我上面的代码并在 3D 矩阵上调用 mat2cell
:
mat2cell(object_intensities, ones(size(object_intensities,1),1), ones(1,size(object_intensities,2)),3)
我有 3 480 行 x 640 列图像。每个像素都有一个强度值。
我在 matlab 中用这个阅读它们:
object_intensities = cell(1,6);
for pat=1:3
file1 = sprintf('image%d.pgm',pat-1);
dummy = double(imread(file1));
object_intensities{pat} = dummy;
end
现在,对于 pat = 1 到 3,object_intensities 是一个元胞数组,使得 object_intensities{pat} 的每个元胞元素都包含 480x640 矩阵数组中的每个图像。
现在我需要的是一个 480 行 x 640 列的单一结构,这样每个单元格元素都包含单个向量中每个图像像素的 3 个强度,如下所示:
structure{row 1, column 1} = [image1_intensity @ row1 column1 image2_intensity @ row1 column1 image3_intensity @ row1 column1]
structure{row 1, column2} = [image1_intensity @ row1 column2 image2_intensity @ row1 column2 image3_intensity @ row1 column2]
.
.
structure{row 480, column 640} = [image1_intensity @ row480 column640 image2_intensity @ row480 column640 image3_intensity @ row480 column640]
有什么方法可以不使用循环而是通过向量化来做到这一点吗?
你要的数据结构是自找麻烦。而是使用 3D 矩阵,其中三维映射您的强度(按顺序)。下线工作会容易得多。
我建议你这样创建它:
object_intensities = zeros(480,640,3);
for pat=1:3
file1 = sprintf('image%d.pgm',pat-1);
object_intensities(:,:,pat) = rgb2gray(imread(file1));
end
现在在你的结构中 object_intensities{i,j}
只是 object_intensities(i,j,:)
如果你真的需要你可以调用 squeeze
或 permute
或 (:)'
使其成为行向量。但是想想现在做一些事情是多么容易,比如找到每个像素的平均强度
mean(object_intensities,3)
与元胞数组相比
cellfun(@mean,object_intensities,'uni',0) %// Just a loop in disguise
如果你想要每行的平均值怎么办
mean(object_intensities,2)
尝试对元胞数组执行此操作,您就会明白为什么要避免它。
但是如果你真的想要你的结构,那么使用我上面的代码并在 3D 矩阵上调用 mat2cell
:
mat2cell(object_intensities, ones(size(object_intensities,1),1), ones(1,size(object_intensities,2)),3)