MATLAB pdist функция

Я использую команду 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 ответа

Решение
%# 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,:)];

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'));

Вы можете использовать функцию 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.

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

Другие вопросы по тегам