首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB pdist函数

MATLAB pdist函数
EN

Stack Overflow用户
提问于 2010-03-19 19:53:30
回答 3查看 13.6K关注 0票数 4

我使用pdist命令来查找存储在矩阵中的x和y坐标之间的距离。

代码语言:javascript
复制
X = [100 100;
      0  100;
     100  0;
     500 400;
     300 600;];

D = pdist(X,'euclidean')

它返回15个元素的向量。:

代码语言:javascript
复制
[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]

有没有办法将这些距离与导出它们的坐标相关联,即将它们存储在具有一般行形式的矩阵中:

代码语言:javascript
复制
[Length xcoordinate1 ycoordinate1 xcoordinate2 ycoordinate2]

在哪里找到每个长度对应一行?

提前感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-19 21:39:22

代码语言:javascript
复制
%# 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,:)];
票数 7
EN

Stack Overflow用户

发布于 2011-05-06 23:21:00

MATLAB有一个名为"squareform“的内置命令,可以将pdist输出转换为n x n距离矩阵http://www.kxcad.net/cae_MATLAB/toolbox/stats/pdist.html

代码语言:javascript
复制
%# define X, D
X = [100 100;
      0  100;
      100  0;
     500 400;
     300 600;];

D = squareform(pdist(X,'euclidean'));
票数 12
EN

Stack Overflow用户

发布于 2010-03-19 23:47:26

您可以使用函数NCHOOSEKX中生成一组索引,并通过以下方式构建矩阵:

代码语言:javascript
复制
>> 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

请注意,只有当X中的列数小于15左右时,函数NCHOOSEK才是一个实用的解决方案。

秒编辑:由于pdist选择点对,因此nchoosek的参数应该简单地为2。它与数据的维度无关。这也会使前面一行上的注释过时。(很抱歉以这种方式编辑,没有足够的代表添加评论,但我真的很喜欢这个答案,并希望修复它) -- Paul

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2476943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档