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');