2010-03-19 2 views
4

pdist 명령을 사용하여 매트릭스에 저장된 x와 y 좌표 간의 거리를 찾습니다.MATLAB pdist function

X = [100 100; 
     0 100; 
    100 0; 
    500 400; 
    300 600;]; 

D = pdist(X,'euclidean') 

이는 15 요소 벡터를 반환합니다. : 행이 각각 존재

[Length xcoordinate1 ycoordinate1 xcoordinate2 ycoordinate2] 

:

[0.734979755525412 3.40039811339820 2.93175207511321 1.83879677592575 2.40127440268306 2.75251513299386 2.21488402640753 1.10610649500317 1.81674017301699 0.903207751535635 1.99116952754924 1.05069952386082 1.24122819418333 1.08583377275532 1.38729428638035] 

일반 로우 형태로 매트릭스에 저장 즉 그들이로부터 파생 된 좌표, 이러한 거리를 연결하는 방법이 길이 찾았 니? 사전에

감사

+0

예제가 맞습니까? * 매우 다른 값을 가진 10 요소 벡터가 있습니다. – gnovice

+2

유용한 다른 기능은 SQUAREFORM입니다. http://www.mathworks.com/access/helpdesk/help/toolbox/stats/squareform.html – Amro

답변

7
%# define X, D 
X = [100 100; 
     0 100; 
    100 0; 
    500 400; 
    300 600;]; 

D = pdist(X,'euclidean'); 

%# find the indices corresponding to each distance 
tmp = ones(size(X,1)); 
tmp = tril(tmp,-1); %# creates a matrix that has 1's below the diagonal 

%# get the indices of the 1's 
[rowIdx,colIdx ] = find(tmp); 

%# create the output 
out = [D',X(rowIdx,:),X(colIdx,:)]; 
1

당신은 X에 인덱스 세트를 생성하고 다음과 같은 방법으로 매트릭스를 구축하기 위해 기능 NCHOOSEK를 사용할 수 있습니다

>> X = [100 100; 0 100; 100 0; 500 400; 300 600]; %# Your sample data 
>> D = pdist(X,'euclidean')' %'# Euclidean distance, with result transposed 

D = 

    100.0000 %# Note that I get different results than your example! 
    100.0000 
    500.0000 
    538.5165 
    141.4214 
    583.0952 
    583.0952 
    565.6854 
    632.4555 
    282.8427 

>> index = nchoosek(1:size(X,1),2); 
>> M = [D X(index(:,1),:) X(index(:,2),:)] %# [Distance X1 Y1 X2 Y2] 

M = 

    100.0000 100.0000 100.0000   0 100.0000 
    100.0000 100.0000 100.0000 100.0000   0 
    500.0000 100.0000 100.0000 500.0000 400.0000 
    538.5165 100.0000 100.0000 300.0000 600.0000 
    141.4214   0 100.0000 100.0000   0 
    583.0952   0 100.0000 500.0000 400.0000 
    583.0952   0 100.0000 300.0000 600.0000 
    565.6854 100.0000   0 500.0000 400.0000 
    632.4555 100.0000   0 300.0000 600.0000 
    282.8427 500.0000 400.0000 300.0000 600.0000 

주 그 기능 NCHOOSEKX의 열 수가 약 15 미만인 경우에만 실용적인 솔루션이 될 수 있습니다.

: pdist은 점 쌍을 선택하므로 nchoosek의 초 인수는 간단히 2이어야합니다. 이는 데이터의 차원과 무관합니다. 이것은 또한 선행하는 줄의 주석을 더 이상 쓸모 없게 만듭니다. (편집을 위해 죄송합니다. 주석을 추가 할 수있는 충분한 담당자가 없지만이 답변을 정말 좋아하고 수정하고 싶었습니다.) - Paul

12

MATLAB은 "squareform"이라는 inbuilt 명령을 사용하여 pdist 출력을 nxn 거리 매트릭스 http://www.kxcad.net/cae_MATLAB/toolbox/stats/pdist.html

%# define X, D 
X = [100 100; 
     0 100; 
     100 0; 
    500 400; 
    300 600;]; 

D = squareform(pdist(X,'euclidean')); 
+0

동일한 문제를 겪은 Python 사용자에게만 설명해주십시오. scipy에서는'squareform'을 사용하여'pdist'의 결과를 정사각형 배열로 변환 할 수 있습니다. 함수는'scipy.spatial.distance'에서 찾을 수 있습니다. 참조 [이 게시물] (http://stackoverflow.com/questions/13079563/how-does-condensed-distance-matrix-work-pdist) –