2010-03-19 185 views
4

我使用pdist命令查找x和存储在一个矩阵y坐标之间的距离。MATLAB pdist功能

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] 

哪里有一排各发现长度?

在此先感谢

+0

你的例子是否正确?我得到了一个10 *元素的*非常*不同的值。 – gnovice 2010-03-19 15:39:25

+2

你可能会发现有用的另一个功能是SQUAREFORM http://www.mathworks.com/access/helpdesk/help/toolbox/stats/squareform.html – Amro 2010-03-19 20:05:41

回答

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

您可以使用函数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。它独立于数据的维度。这也使得前一行的注释变得过时。 (对不起,编辑这种方式,没有足够的代表添加评论,但我真的很喜欢这个答案,并想修复它) - 保罗

12

MATLAB有一个内置的命令称为“方形”,将pdist输出转换为一个nxn距离矩阵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')); 
+0

只是为了蟒蛇用户谁见了同样的问题发表评论。在SciPy的,你也可以使用'squareform'到pdist'的'结果等转换成方形阵列。这些函数可以在'scipy.spatial.distance'中找到。比照[此篇](http://stackoverflow.com/questions/13079563/how-does-condensed-distance-matrix-work-pdist) – 2015-12-28 09:54:42