您不需要使用 arrayfun 对 matlab 中的对象数组进行操作。从对象数组中获取属性数组有一个非常有用的简写:
[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(距离);
min 函数返回一个 1x2 数组,第一个位置是最小值,第二个是索引。我使用 matlab 表示法表示[~, idx]
我对第一个返回值不感兴趣,第二个应该存储在变量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');