【问题标题】:Calculating Euclidean distance of pairs of 3D points in matlab在matlab中计算3D点对的欧几里得距离
【发布时间】:2014-11-05 00:00:36
【问题描述】:

我有一个包含 N 个 3D 点的 Nx3 数组

a1 b1 c1 
a2 b2 c2
.... 
aN bN cN 

我想计算 NxN 数组中的欧几里得距离,该数组测量每对 3D 点之间的欧几里得距离。结果数组中的 (i,j) 返回 (ai,bi,ci)(aj,bj,cj) 之间的距离。是否可以在matlab中编写没有循环的代码?

【问题讨论】:

标签: arrays matlab matrix euclidean-distance


【解决方案1】:

你的问题的挑战是制作一个 N*N 矩阵,结果应该在这个矩阵中返回而不使用循环。 我通过为 Bsxfun 函数提供合适的维度来克服这一挑战。默认情况下,当我们调用 bsxfun 函数时,X 和 ReshapeX 应该具有相同的尺寸。但是,如果矩阵的大小不相等,并且其中一个具有单例(等于 1)维,则该矩阵实际上会沿该维复制以匹配另一个矩阵。因此,它返回 N*3*N 矩阵,该矩阵提供每个 3D 点与其他点的减法。

ReshapedX = permute(X,[3,2,1]);
DiffX = bsxfun(@minus,X,ReshapedX);
DistX =sqrt(sum(DiffX.^2,2));
D = squeeze(DistX);

【讨论】:

    【解决方案2】:

    完成 Divakar 的评论:

    x = rand(10,3);
    pdist2(x, x, 'euclidean')   
    

    【讨论】:

    • pdist2 在这种情况下需要大约两倍于pdist 的距离计算次数。
    【解决方案3】:

    使用pdistsquareform

    D = squareform( pdist(X, 'euclidean' ) ); 
    

    对于初学者来说,使用 计算距离矩阵D 可能是一个很好的练习(悬停以查看解决方案)。

    elemDiff = bsxfun( @minus, permute(X,[ 1 3 2 ]), permute(X, [ 3 1 2 ]) );
    D = sqrt( sum( elemDiff.^2, 3 ) );

    【讨论】:

      猜你喜欢
      • 2014-01-17
      • 2014-10-27
      • 2015-01-16
      • 1970-01-01
      • 2020-11-29
      • 2018-02-14
      • 2013-04-07
      • 2021-01-31
      • 2015-09-23
      相关资源
      最近更新 更多