pdist
을 사용할 때 의문이 생겼습니다. 조언을 해 주시면 감사하겠습니다. pdist(D)
은 일반적으로 여러 차원에 대한 거리의 합계를 제공하지만 거리를 별도로 가져 오려고합니다. 예를 들어 데이터 세트가 S
이고 10 * 2 매트릭스 인 경우 pdist(S(:,1))
및 pdist(S(:,2))
을 별도로 사용하지만 데이터에 여러 차원이있는 경우 매우 비효율적 인 것으로 보입니다. 더 효율적인 방법을 찾기위한 대안이 있습니까? 미리 감사드립니다!유클리드 거리를 다른 차원에서 어떻게 별도로 계산합니까?
답변
포인트의 개별 치수 사이의 절대 차이를 원한다고 가정하면 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));
또 다른 옵션과 같은 결과를 제공 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
에 포인트 p
과 q
사이의 거리를 제공합니다 당신은 MATLAB의 2016b 이상을 사용 (또는 옥타브)하는 경우 같은 거리를 만들 수
>> squeeze(dist(3, 5, :))
ans =
11
9
참고 : 벡터에 넣어 squeeze
를 사용한다모든 (또는 다중) 차원에서 q
, bsxfun
없이 매트릭스 :
dist = abs(permute(D, [1 3 2]) - permute(D, [3 1 2]))
이 방법의 단점은 잠재적으로 메모리 문제가 될 수있는 두 번 각각의 거리를 생성하고, 그래서 전체 대칭 행렬을 생성한다는 것입니다.
감사합니다 @ 비커. 이것은 매우 좋은 이상입니다.'exp (-10 * dist (:, :, 1).^2 - 5 * dist (:, : 2)를 계산하는 방법이 있다면 궁금합니다.^2)'효율적으로. – zdeng
@jodag에 감사드립니다. 귀하의 접근 방식은 매우 유용합니다. 'dist '를 얻은 후에'exp (sum (10. * dist.^2,2))'를 계산하려면 제안 사항이 있습니까? – zdeng
필자가 작성한 것보다 더 빨리 뭔가를 찾을 수 있을지 의심 스럽다. – jodag
아니면 'bsxfun'이 더 빠를까요? – zdeng