MATLAB pdist функция - PullRequest
       33

MATLAB pdist функция

4 голосов
/ 19 марта 2010

Я использую команду pdist, чтобы найти расстояние между координатами x и y, сохраненными в матрице.

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

D = pdist(X,'euclidean')

Возвращает вектор из 15 элементов. :

[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]

Есть ли способ связать эти расстояния с координатами, из которых они были получены, то есть сохранить их в матрице с общей строкой:

[Length xcoordinate1 ycoordinate1 xcoordinate2 ycoordinate2]

Где есть строка для каждой найденной длины?

Заранее спасибо

Ответы [ 3 ]

12 голосов
/ 06 мая 2011

MATLAB имеет встроенную команду под названием "квадратная форма", которая преобразует вывод pdist в матрицу расстояний n x n 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'));
7 голосов
/ 19 марта 2010
%# 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 голос
/ 19 марта 2010

Вы можете использовать функцию NCHOOSEK , чтобы сгенерировать набор индексов в X и построить свою матрицу следующим образом:

>> 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

Обратите внимание, что функция NCHOOSEK будет практическим решением, только если число столбцов в X меньше, чем около 15.

edit : поскольку pdist выбирает пары точек, аргумент секунд для nchoosek должен быть просто 2. Он не зависит от размерности ваших данных. Это также делает примечание на предыдущей строке устаревшим. (извините за редактирование таким образом, не хватает представителя, чтобы добавить комментарий, но мне очень понравился этот ответ и я хотел его исправить) - Пол

...