2016-12-05 2 views
0

난 같은 구조 배열 가지고 그것MATLAB에서 구조 배열의 멤버십을 테스트하는 방법은 무엇입니까?

points(1).x = 3 
points(1).y = 4.5 
points(1).z = 1 
... 
points(n).x = 2 
points(n).y = 23 
points(n).z = 4 

지금 주어진 세 개의 좌표 (x, y, z), I는하려는 많은 점

points = struct('x',[],'y',[],'z',[]) 

가 지금 존재하는 경우 이러한 points을 가리킨다. 따라서 다음과 같은 함수를 정의했습니다 :

function true_or_false = is_in(points, point) 
for i = 1:numel(points) 
    if abs(points(i).x - point.x) < 1e-7 && ... 
     abs(points(i).y - point.y) < 1e-7 && ... 
     abs(points(i).z - point.z) < 1e-7  
     true_or_false = true; 
     return 
    end 
end 
true_or_false = false; 
end 

문제는 매우 비효율적이라는 것입니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 아마도 구조 대신에 뭔가 다른 것을 사용하고 있을까요?

+0

[코드 검토] (http://codereview.stackexchange.com/)를 요청하십니까? –

+0

나는 문제를 해결하기위한 효율적인 대안을 요구하고있다. – IIIaxS

답변

3

이 작업은 [s.fieldname] 또는 {s.fieldname}처럼 정사각형 또는 중괄호 안에 쉼표로 구분 된 목록을 "catch"하는 Matlab의 기능을 활용하여 벡터화 할 수 있습니다. struct 다중 필드의 필드를 역 참조 할 때 "쉼표로 구분 된 목록"이 암시 적으로 생성됩니다. 각 예제가 스칼라이므로이 경우 대괄호 안의 값을 연결하는 데 아무런 문제가 없습니다. 각 좌표에 대해 n 개의 숫자 벡터 ([points.x], [points.y][points.z])를 사용합니다. 아마 당신의 루프 방식보다 더 효율적으로 할 수 없습니다 (당신의 필드 값이 스칼라하지 않을 수 있습니다, 또는 숫자하지 않을 수 있습니다)

function [true_or_false, matches] = is_in(points, point) 

matches = abs([points.x] - point.x) < 1e-7 & abs([points.y] - point.y) < 1e-7 & abs([points.z] - point.z) < 1e-7; 
true_or_false = any(matches); 

더 - 일반적인 경우 : 그럼 당신은 뭔가를 할 수 있습니다.

관련 문제