Get minimum property value from array of objects
matlab
Solution
You don't need to use arrayfun to operate on arrays of objects in matlab. There's a very useful shorthand for getting an array of properties out of an array of objects:
[rectangles.minx]
That yields all rectangle's `minx` in an array.
So to know which is the point closest to the origin, I would calculate the good ol' euclidean distance to the origin. With the vectors at hand, that's REALLY simple.
The euclidean distance is defined as follows:
d(a,b) = sqrt( (a.x - b.x)^2 + (a.y - b.y)^2);
to calculate it with your vectors:
distances = sqrt([rectangles.minx].^2 + [rectangles.miny].^2)
This will yield a vector with the distances of all points. Finding the minimum is trivial:
[~, idx] = min(distances);
The min function returns a 1x2 array, the first position is the minimum value, the second is the index. I've used the matlab notation `[~, idx]` to state that I'm not interested in the first return value, and the second should be stored on the variable `idx`.
I've written an example in which I have created my rectangle class only to test it, but it will work with your class as well. Below are the codes for the class I've defined and the code that calculates the point closest to (0,0).
Run it to play with the idea and adapt it to your needs :)
Test Class definition (save that in a file called 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
Code
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');
Problem
Apologies if this is a stupid question, I'm relatively new to Matlab. I've got an array of rectangles of class Rectangle with properties `minx, miny, maxx, maxy`, which represent the corner coordinates. I'm trying to get the index of the top-left rectangle in the array. I can loop through the objects to get the object that corresponds to the minimum x and y coordinates, but this doesn't seem like a very matlabic (matlabian? doesn't sound nearly as good as pythonic) way to do it. ``` 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 ```