将结构聚合成矢量的典型方法

时间:2014-05-14 20:32:16

标签: matlab

我觉得愚蠢甚至不得不问这个,它真的应该是死的简单,但对MatLab来说是新手我想知道一个更有经验的人会怎么做。

简单的问题;我需要在多个图像中找到一些区域,按位置关联它们,保存那些感兴趣的区域,并在以后使用它们。一种方法是将区域存储在矢量中。

%% pseudo code
regions = [];
for i = some_vector_of_images
  % segment, get mask
  % find regions
  cc = bwconncomp(mask);
  stats = regionprops(cc, 'all');
  % correlate against known x/y
  % save for later
  regions[index++] = stats;
end
% use 'regions'

但是,数组声明存在问题。它的默认类型是double,因此无法工作(无法为元素分配结构)。我已尝试struct.empty,但数组无法调整大小。我尝试过一个单元格数组,但是我收到了类似的错误(Conversion to cell from struct is not possible.

真的,我只需要一种方法在循环之前声明一些集合,这些集合将保存这些结构的实例。再一次,相当愚蠢的问题,在这里有点尴尬......请怜悯。

3 个答案:

答案 0 :(得分:1)

查看使用 struct2cell 是否可以帮助您解决此问题。试试这个pseudo-code -

regions = cell(num_of_images,1) %// This will be before the loop starts
...

regions[index++] = {struct2cell(stats)} %// Inside the loop

请注意,这不是pseudo-code,因此square brackets++无效。

因此,伪代码的完整版本将是 -

%%// ---  pseudo code

%// Without this pre-allocation you would get the error - 
%%// "Conversion to cell from struct is not possible"
regions = cell(numel(some_vector_of_images),1) 

for i = some_vector_of_images
  % segment, get mask
  % find regions
  cc = bwconncomp(mask);
  stats = regionprops(cc, 'all');
  % correlate against known x/y
  % save for later
  regions(i) = {struct2cell(stats)}
end

答案 1 :(得分:1)

您可以通过附加结构将空数组转换为结构数组。将regions[index++] = stats;替换为

regions = [regions, stats];

这一行将继续在循环中构建数组。这个习惯用法在MATLAB中通常不受欢迎,因为每个循环都需要创建一个新的数组。

另一种方法是使用repmat。

预先使用模板结构分配数组
stats = some_operations_on(some_vector_of_images(1));
regions = repmat(stats, numel(some_vector_of_images), 1);

并在循环内,使用

进行分配
regions(i) = stats;

答案 2 :(得分:1)

在这种情况下,通常我根本不会预先分配,或者使用cell-cat模式。

未初始化

这个没有初始化struct数组,但工作正常。在这种情况下,请确保i是每个元素的索引。

for i = 1:numel(some_vector_of_images)
  % mask = outcome of some_vector_of_images(i)
  cc = bwconncomp(mask);
  regions(i) = regionprops(cc, 'all');
end

细胞 - 猫模式

这个捕获结果是一个单元格数组,并在最后连接所有元素。

regions = cell(numel(some_vector_of_images), 1);
index = 1;
for i = some_vector_of_images
  % mask = outcome of i
  cc = bwconncomp(mask);
  regions{index} = regionprops(cc, 'all');
  index = index + 1;
end
regions = cat(1, regions{:});