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

您不需要使用 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');
于 2012-04-07T16:16:43.793 回答
2

您的代码正在查找更靠左的矩形或最靠上的矩形。如果您不担心 minx 具有相同值的多个 retangles,您可以这样做

[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 回答