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 ループと cell2mat の 3 回の呼び出しを行わずに、この小さな関数適切な方法で記述する方法を知っておくと本当に便利です。

私の例では:

  • 行は<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 に答える