Расстояние между двумя точками в Matlab - PullRequest
4 голосов
/ 17 ноября 2011

У меня есть 2 вектора, один из которых имеет размер 200 * 2, а другой - 3 * 2. Все они являются точками в декартовой системе координат. Я хочу рассчитать расстояние между первыми 200 и тремя другими точками и сохранить их в векторе. Я использую функцию, подобную этой;

for i=1:cur
    for j=1:200
        L(j,i)=sqrt(square(P2(i,1)-C(j,1))+square(P2(i,2)-C(j,2)))
    end
end

, где cur равен 3, P2 - вектор 3 * 2, а C - 200 * 2. Теперь результаты, которые я получаю, совершенно неверны, но я не могу понять проблему в этом. Любая помощь была бы полезна, если бы был другой способ ее вычисления, я был бы признателен. Для получения дополнительной информации

P2 = [2 -2;3 -5 ; -1 3];

, а другой

theta = linspace(0,2*pi,200)';   %'
unitCircle = [cos(theta) sin(theta)];
C = zeros(numel(theta),2,num);

Ответы [ 3 ]

7 голосов
/ 17 ноября 2011

square не для возведения в квадрат значения, оно возвращает значения прямоугольной волны.

Вы можете использовать pdist2 для вычисления попарного расстояниямежду двумя наборами наблюдений следующим образом:

X = randn(200, 2);
Y = randn(3, 2);
D = pdist2(X,Y,'euclidean'); % euclidean distance
1 голос
/ 17 ноября 2011

Функция square - это не то, что вам нужно ( генерирует прямоугольную волну ).

Чтобы вычислить квадрат числа, используйте оператор ^:

x = 3;
y = x ^ 2;
disp(y);  % Prints 9
0 голосов
/ 25 июля 2014
tic
A = pdist2( X,  X);
toc
% method 2
tic
n = size(X, 1);
idx = repmat(1:n, n, 1);
D = sqrt(sum((X(idx,:)-X(idx',:)).^2, 2));
D = reshape(D, n, n);
toc
find(A-D)
Elapsed time is 0.021950 seconds.
Elapsed time is 0.043413 seconds. % and add your satisfaction approximately -0.02 seconds
...