N, M 2d 벡터를 나타내는 두 개의 행렬 Nx2, Mx2가 있다고 가정합니다. 각 벡터 쌍 (n, m) 사이의 거리를 계산하는 간단하고 좋은 방법이 있습니까?
쉽고 비효율적 인 방법은 물론입니다.
d = zeros(N, M);
for i = 1:N,
for j = 1:M,
d(i,j) = norm(n(i,:) - m(j,:));
endfor;
endfor;
내가 찾은 가장 가까운 대답은 bsxfun
다음과 같이 사용됩니다.
bsxfun(inline("x-y"),[1,2,3,4],[3;4;5;6])
ans =
-2 -1 0 1
-3 -2 -1 0
-4 -3 -2 -1
-5 -4 -3 -2
나는 이것을 보았고 계산을 벡터화하는 것보다 훨씬 나을 수 없었습니다. 이 계산은 외부 C / Fortran 함수를 작성하는 데 매우 적합한 후보라고 생각합니다.
—
Aron Ahmadia 2019
외부 제품으로 채운 2xNxM 행렬을 만든 다음 각 항목을 제곱하고 0 번째 축과 제곱근을 따라 합산 할 수 있습니다. 파이썬에서 이것은 다음과 같습니다 : distance_matrix = (n [:, :, nexaxis] * m [:, newaxis ,:]); distance_matrix = 거리 _ 매트릭스 ** 2; distance_matrix = sqrt (거리 _matrix.sum (축 = 1)); 가장 가까운 n- 벡터 만 알아야하는 경우 훨씬 더 좋은 방법이 있습니다!
—
meawoppl
(옥타브 뉴) @meawoppl 내가 사용하는 방법을 발견 선형 대수 제공 옥타브에서 패키지를
—
Kelley van Evert
cartprod
: 그래서 지금 내가 쓸 수, (1) x = cartprod(n(:,1), m(:,1));
(2) y = cartprod(n(:,2), m(:,2));
(3) d = sqrt((x(:,1)-x(:,2)).^2+(y(:,1)-y(:,2)).^2)
요식 훨씬 빠르게 실행됩니다!