3

これがばかげた質問である場合はお詫びします。私はMatlabに比較的慣れていません。

クラス Rectangle の長方形の配列をプロパティで取得しましたminx, miny, maxx, maxy。これは角の座標を表します。

配列の左上の四角形のインデックスを取得しようとしています。

オブジェクトをループして、最小の x 座標と y 座標に対応するオブジェクトを取得できますが、これは非常に matlabic のようには見えません (matlabian? は pythonic ほど良く聞こえません)。

minx = -1
miny = -1
tl_rect_id = 0

for id = 1:num_objects
    if ((rectangles(id).minx < minx || minx == -1) && (rectangles(id).miny < miny || miny == -1)) 
        tl_rect_id = id
        minx = rectangles(id).minx
        miny = rectangles(id).miny

    end

    % plot coordinates of top left corners
    plot(rectangles(id).minx,rectangles(id).miny,'+r')
end
4

2 に答える 2

4

matlab でオブジェクトの配列を操作するために arrayfun を使用する必要はありません。オブジェクトの配列からプロパティの配列を取得するための非常に便利な省略形があります。

[rectangles.minx]

minxこれにより、配列内のすべての長方形が生成されます。

したがって、原点に最も近い点を知るために、原点までの古き良きユークリッド距離を計算します。ベクトルが手元にあれば、それは本当に簡単です。

ユークリッド距離は次のように定義されます。

d(a,b) = sqrt( (a.x - b.x)^2 + (a.y - b.y)^2);

あなたのベクトルでそれを計算するには:

distances = sqrt([rectangles.minx].^2 + [rectangles.miny].^2)

これにより、すべてのポイントの距離を持つベクトルが生成されます。最小値を見つけるのは簡単です:

[~, idx] = 分 (距離);

min 関数は 1x2 の配列を返します。最初の位置は最小値、2 番目の位置はインデックスです。私は matlab 表記[~, idx]を使用して、最初の戻り値には関心がなく、2 番目の戻り値は variable に格納する必要があることを示しましたidx

長方形クラスをテストするためだけに作成した例を書きましたが、それはあなたのクラスでも動作します。以下は、私が定義したクラスのコードと、(0,0) に最も近いポイントを計算するコードです。

それを実行してアイデアを試し、ニーズに合わせてください:)

クラス定義をテストします (Rectangle.m というファイルに保存します):

classdef Rectangle
    properties
        minx;
        miny;
    end
    methods
        function obj = Rectangle(v1,v2)
         if nargin > 1
            obj.minx = v1;
            obj.miny = v2;
         end
      end
    end
end

コード

clear all;
numRect = 100;
rect_array = Rectangle(numRect);

% initialize rectangles
for n=1:numRect
    r = Rectangle;
    r.minx = 100*rand(1,1);
    r.miny = 100*rand(1,1);
    rect_array(n) = r;
end

% find point closest to the origin

[~, idx] = min(sqrt([rect_array.minx].^2 + [rect_array.miny].^2));

close all;
figure;
% plot the points in blue
plot([rect_array.minx],[rect_array.miny],'b.');
hold on;
% mark a red cross on the point closest to the origin
plot(rect_array(idx).minx, rect_array(idx).miny, 'rx');
于 2012-04-07T16:16:43.793 に答える
2

あなたのコードは、さらに左にある長方形、またはそれが最も上にある長方形のいずれかを見つけています。minxの値が同じである複数のリタングルについて心配していない場合は、次のことができます。

[v i] = min(arrayfun(@(i)rectangles(i).minx, 1:num_objects))
fprintf('Furthest left rectangle is %g\n', i);

または、次のようにすることもできます。

[v i] = sortrows(cell2mat(arrayfun(@(i)[rectangles(i).minx; rectangles(i).miny], 1:num_objects, 'uniformoutput', 0))');
fprintf('Furthest left rectangle is %g\n', i(1));

X、Yの順に並べ替えてから、この順序で最初に並べ替えます。ソートを行うため、これは遅くなります。上記のアルゴリズムの正確な動作を取得するには、おそらくforループに固執する必要があります。簡潔に行うのは、面倒だと思います。

于 2012-04-07T15:34:10.107 に答える