2012-04-07 11 views
3

Entschuldigung, wenn das eine dumme Frage ist, bin ich relativ neu für Matlab.Erhalten Sie minimale Eigenschaft Wert von Array von Objekten

Ich habe eine Reihe von Rechtecken der Klasse Rectangle bekomme mit Eigenschaften minx, miny, maxx, maxy, die die Ecke Koordinaten darstellen.

Ich versuche, den Index des oberen linken Rechtecks ​​im Array zu erhalten.

Ich kann durch die Objekte durchlaufen, um das Objekt zu erhalten, das den minimalen X- und Y-Koordinaten entspricht, aber dies scheint nicht sehr Matlabisch (Matlabian? Klingt nicht annähernd so gut wie Python) Weg zu tun es.

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 

Antwort

4

Sie brauchen nicht auf Arrays von Objekten in Matlab zu bedienen verwenden arrayfun. Es gibt eine sehr nützliche Abkürzung für immer eine Reihe von Eigenschaften aus einem Array von Objekten:

[rectangles.minx] 

, dass alle Rechtecke minx in einem Array liefert.

So zu wissen, welche der Punkt zum Ursprung am nächsten ist, würde ich die guten alten euklidischen Abstand zum Ursprung berechnen. Mit den Vektoren zur Hand, das ist WIRKLICH einfach.

der euklidische Abstand wird wie folgt definiert:

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

es mit Vektoren zu berechnen:

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

Dies wird ein Vektor mit den Entfernungen aller Punkte ergeben. das Minimum zu finden, ist trivial:

[~, idx] = min (Abstände);

Die min-Funktion gibt einen 1x2-Array, wobei die erste Position der Minimalwert ist, der zweite der Index ist. Ich habe die Matlab-Notation [~, idx] verwendet, um anzugeben, dass ich nicht an dem ersten Rückgabewert interessiert bin, und die zweite sollte in der Variablen idx gespeichert werden.

Ich habe ein Beispiel, in dem geschrieben ich nur meine Rechteck-Klasse erstellt habe, um es zu testen, aber es wird auch mit Ihrer Klasse arbeiten. Unten sind die Codes für die Klasse, die ich definiert habe, und der Code, der den Punkt berechnet, der (0,0) am nächsten ist.

Run es mit der Idee zu spielen und es an Ihre Bedürfnisse anpassen :)

Testklasse Definition (das Rectangle.m in einer Datei speichern genannt):

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

Ihr Code findet entweder das Rechteck, das weiter links ist, oder das Rechteck, das am weitesten oben liegt. Wenn Sie sich nicht Sorgen um für minx mehrere retangles sind mit dem gleichen Wert, könnten Sie

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

tun Alternativ können Sie tun:

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

, die durch X sortieren und dann Y, und dann nimm die erste in dieser Reihenfolge. Das ist langsamer, weil es eine Sortierung durchführt. Um das genaue Verhalten Ihres Algorithmus oben zu verstehen, sollten Sie wahrscheinlich nur bei den for-Schleifen bleiben. Ich denke, es wäre chaotisch, wenn Sie es präzise machen würden.

Verwandte Themen