2017-11-19 7 views
0

pdist을 사용할 때 의문이 생겼습니다. 조언을 해 주시면 감사하겠습니다. pdist(D)은 일반적으로 여러 차원에 대한 거리의 합계를 제공하지만 거리를 별도로 가져 오려고합니다. 예를 들어 데이터 세트가 S이고 10 * 2 매트릭스 인 경우 pdist(S(:,1))pdist(S(:,2))을 별도로 사용하지만 데이터에 여러 차원이있는 경우 매우 비효율적 인 것으로 보입니다. 더 효율적인 방법을 찾기위한 대안이 있습니까? 미리 감사드립니다!유클리드 거리를 다른 차원에서 어떻게 별도로 계산합니까?

답변

3

포인트의 개별 치수 사이의 절대 차이를 원한다고 가정하면 pdist은 과도합니다. 당신은 다음과 같은 간단한 기능 S의 행의 모든 ​​쌍 사이의 절대 페어의 차이를 반환

function d = pdist_1d(S) 
    idx = nchoosek(1:size(S,1),2); 
    d = abs(S(idx(:,1),:) - S(idx(:,2),:)); 
end 

를 사용할 수 있습니다. 당신은 단순히 좌표의 절대 차이를 취하고 있기 때문에이 경우

dist = pdist_1d(S) 

에서

은 사용하는 것입니다,

dist = cell2mat(arrayfun(@(dim)pdist(S(:,dim))',1:size(S,2),'UniformOutput',false)); 
+0

@jodag에 감사드립니다. 귀하의 접근 방식은 매우 유용합니다. 'dist '를 얻은 후에'exp (sum (10. * dist.^2,2))'를 계산하려면 제안 사항이 있습니까? – zdeng

+0

필자가 작성한 것보다 더 빨리 뭔가를 찾을 수 있을지 의심 스럽다. – jodag

+0

아니면 'bsxfun'이 더 빠를까요? – zdeng

1

또 다른 옵션과 같은 결과를 제공 bsxfun :

>> D = randi(20, 10, 2) % generate sample data 
D = 

    17 12 
    14 10 
    8 4 
    7 11 
    19 13 
    2 18 
    11 14 
    5 19 
    19 12 
    20 8 

여기에서 좌표 (열)가 확장되도록 데이터를 바꿉니다. 3 차원 및 행으로 첫번째 인수에 대한 1 차원이며, 제 2 인자에 대한 2 차원 :이 3 차원 대칭 행렬 결과

>> dist = bsxfun(@(x,y)abs(x-y), permute(D, [1 3 2]), permute(D, [3 1 2])) 
dist = 

ans(:,:,1) = 

    0 3 9 10 2 15 6 12 2 3 
    3 0 6 7 5 12 3 9 5 6 
    9 6 0 1 11 6 3 3 11 12 
    10 7 1 0 12 5 4 2 12 13 
    2 5 11 12 0 17 8 14 0 1 
    15 12 6 5 17 0 9 3 17 18 
    6 3 3 4 8 9 0 6 8 9 
    12 9 3 2 14 3 6 0 14 15 
    2 5 11 12 0 17 8 14 0 1 
    3 6 12 13 1 18 9 15 1 0 

ans(:,:,2) = 

    0 2 8 1 1 6 2 7 0 4 
    2 0 6 1 3 8 4 9 2 2 
    8 6 0 7 9 14 10 15 8 4 
    1 1 7 0 2 7 3 8 1 3 
    1 3 9 2 0 5 1 6 1 5 
    6 8 14 7 5 0 4 1 6 10 
    2 4 10 3 1 4 0 5 2 6 
    7 9 15 8 6 1 5 0 7 11 
    0 2 8 1 1 6 2 7 0 4 
    4 2 4 3 5 10 6 11 4 0 

여기서

dist(p, q, d) 

당신이사이의 거리를 원하는 경우에 당신에게

dist(p, q, d) == dist(q, p, d) 

와 차원 d에 포인트 pq 사이의 거리를 제공합니다 당신은 MATLAB의 2016b 이상을 사용 (또는 옥타브)하는 경우 같은 거리를 만들 수

>> squeeze(dist(3, 5, :)) 
ans = 

    11 
    9 

참고 : 벡터에 넣어 squeeze를 사용한다모든 (또는 다중) 차원에서 q, bsxfun없이 매트릭스 :

dist = abs(permute(D, [1 3 2]) - permute(D, [3 1 2])) 

이 방법의 단점은 잠재적으로 메모리 문제가 될 수있는 두 번 각각의 거리를 생성하고, 그래서 전체 대칭 행렬을 생성한다는 것입니다.

+0

감사합니다 @ 비커. 이것은 매우 좋은 이상입니다.'exp (-10 * dist (:, :, 1).^2 - 5 * dist (:, : 2)를 계산하는 방법이 있다면 궁금합니다.^2)'효율적으로. – zdeng

관련 문제