2013-01-23 4 views
7

저는 약 144 점의 영역이 있습니다. 내가 원하는 것은 다른 모든 점과의 거리를 측정하여 배열에 저장하는 것입니다. 나는 모든 요점을 위해 이것을하고 싶다. 가능하다면 반복하지 않는 방식으로이 데이터를 저장하고 싶습니다. 그리고 나는 같은 쿼리를 만들 수 있어야합니다 - 반복하지 않고 모든 포인트 사이의 모든 거리, 포인트 no56 등 모든 거리의 합계한 지역에있는 모든 점들의 거리를 서로 계산합니다.

나는 포인트의 좌표를 저장하는 두 개의 열이있는 3 * 144 배열이 있습니다. .

+0

X의 모든 지점 사이의 모든 페어 거리를 제공하는 경우 , [MATLAB에서 pairwise distance를 계산하기위한 세 가지 방법의 비교를 사용하여이 답변에 대한 링크]를 제공하려고합니다 (http://stackoverflow.com/a/19456458/2778484). 다른 질문은 끔찍하게 혼란 스럽지만 대답은 어떤 차원에서 마지막 방법 인 쌍 방향 거리를 다룬다. – chappjc

답변

6

가능한 솔루션 (그래도 난, 당신이 더 반복에 의해 무슨 뜻인지 정말 분명하지 않다) : 물론

X are your points with coordinates x = X(:,1), y = X(:,2) 


dist = sqrt(bsxfun(@minus,X(:,1),X(:,1)').^2 + bsxfun(@minus,X(:,2),X(:,2)').^2) 

그래서

dist(i,j) is the euclidean distance between i and j 

행렬은 대칭이다. 복잡성을 쉽게 줄일 수 있습니다.

+0

반복해서 말한 점은 A에서 B까지의 거리 형태가 B에서 A까지와 같기 때문에 설명해서는 안됩니다. – Vikram

+0

@Vikram, 맞습니다. 행렬은 실제로 대칭입니다. 그건 그렇고, 적은 수의 포인트 (144)로, 더 똑똑한 방식보다 더 똑똑한 방식 일 것입니다. 한번 시도해보십시오. – Acorbe

2

배열이 A 인 경우 각 열에 단일 점의 좌표가 저장되어 있다고 가정 해 보겠습니다. 당신이 Statistics Toolbox 설치 한 경우

dist = sqrt(sum((A(:, pairs(:, 1)) - A(:, pairs(:, 2))) .^ 2, 1)) 

, 당신이 대신 pdist(A)을 사용할 수 있습니다 다음 Euclidean distance과 같이

pairs = nchoosek(1:size(A, 2), 2) 

그런 다음 계산 : (반복없이) 모든 점 쌍의 조합을 얻으려면, nchoosek 사용 같은 효과.

+0

pdist 함수가 있습니다. [pdist (A)] [4]의 [4]는 무엇을 설명합니까? – Vikram

+0

@Vikram 그것은 단지 타이핑 오류 일뿐입니다. (나는'pdist' 공식 문서에 하이퍼 링크를 만들려고했습니다). 'pdist (A)'여야합니다. 결정된. –

1

당신은 통계 도구 상자를 가지고, 당신은 다음, 배열 X의 모든 데이터가있는 경우

D = pdist(X) 

난 그냥이 질문을 발견

+0

대칭 거리 매트릭스가 아닌 삼각형 매트릭스로 살 수 있다면 가장 쉬운 솔루션입니다 (['squareform'] (http://www.mathworks.com/help/stats/squareform.html)가 모든 것을 얻을 수 있습니다) . +1 참고로 [pdist와 다른 "수동"솔루션의 비교에 대한이 다른 게시물의 답변 "] (http://stackoverflow.com/a/19456458/2778484)을 참조하십시오. – chappjc

관련 문제