2

我想在 MATLAB中绘制连接点。

我的连接点来自"stats"的连接对象,其中每个"stat"来自BW regionprops结构。

我编写的代码可以工作,但它有很多“丑陋”,即使尝试了各种方法我也无法修复。

function plot_line( line )

a = cell2mat(line);
b = {a.Centroid};

matx = {};
maty = {};

for i = 1:size(b,2)
    matx{end+1} = b{i}(1);
    maty{end+1} = b{i}(2);
end

plot ( cell2mat(matx), cell2mat(maty) );

end

你能帮我把这段代码做得更好吗?这并不重要,因为我的代码运行良好,而且线条很短(<100 点),因此性能不是问题。

只是很高兴知道应该如何以正确的方式编写这个小函数,而不需要 for 循环和 3 次 cell2mat 调用。

在我的例子中:

  • 线是<1xn cell>,
  • line{1}有一个财产'Centroid'
  • line{i}.Centroid(1)是 x 坐标和
  • line{i}.Centroid(2)是 y 坐标。

实际上,我需要的只是绘制line{i}.Centroid(1), line{i}.Centroid(2)for i = 1:size(line,2),但我不知道如何。

4

2 回答 2

2

您可以通过使用CATb进行连接来直接创建数值数组,而不是创建元胞数组:

tmp = cat(1,line{:});

coordinates = cat(1,tmp.Centroid);

plot(coordinates(:,1),coordinates(:,2))

编辑

如果您想保持非常短(即甚至比@Amro的解决方案更短,您可以像这样使用CELLFUN以获得单线:

plot(cellfun(@(x)x.Centroid(1),line),cellfun(@(x)x.Centroid(2),line))
于 2011-11-10T00:55:08.290 回答
1

例子:

line = repmat({struct('Centroid',[1 2])},1,5);   %# similar to the data you have

%# extract x/y coordinates
x = cellfun(@(s)s.Centroid(1),line)
y = cellfun(@(s)s.Centroid(2),line)

%# plot
plot(x,y)

你也可以这样做:

xy = cell2mat(cellfun(@(s)s.Centroid, line, 'UniformOutput',false)');
plot(xy(:,1),xy(:,2))
于 2011-11-10T01:17:31.407 回答