2012-04-07 5 views
3

사과가 어리석은 질문 인 경우, 저는 Matlab을 처음 사용합니다.객체 배열에서 최소 속성 값 가져 오기

모서리 좌표를 나타내는 minx, miny, maxx, maxy 속성을 가진 Rectangle 클래스의 사각형 배열이 있습니다.

배열에서 왼쪽 위 사각형의 인덱스를 가져 오려고합니다.

최소 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

matlab에서 객체 배열을 조작하는 데 arrayfun을 사용할 필요가 없습니다.

[rectangles.minx] 

모든 사각형의 minx 배열을 산출 : 객체의 배열에서 속성의 배열을 취득하기위한 매우 유용한 속기가있다.

그래서 원점에 가장 가까운 점을 알고 싶으면 원점과의 좋은 '유클리드 거리를 계산할 것입니다. 바로 옆의 벡터를 사용하면 REALLY이 간단합니다. 다음과 같이

유클리드 거리가 정의됩니다

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

코드가 더 왼쪽에있는 사각형 또는 가장 멀리있는 사각형 중 하나를 찾습니다. 당신이 할망구에 대해 동일한 값을 갖는 여러 retangles에 대해 걱정하지 않은 경우, 당신은 당신이 할 수있는, 또는

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

을 할 수있는 : 다음 X를 기준으로 정렬 한 후 Y, 것

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

을 이 순서대로 첫 번째로 취하십시오. 이것은 정렬을 수행하기 때문에 속도가 느립니다. 위의 알고리즘의 정확한 동작을 얻으려면 for 루프 만 사용해야한다. 간결하게 처리하는 것이 더러워 질 것이라고 생각한다.