在Matlab中计算3D点对之间的欧几里得距离

3

我有一个Nx3的数组,其中包含N个三维点

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

我希望能够在一个NxN的数组中计算欧几里得距离,该距离衡量每对3D点之间的欧几里得距离。结果数组中的(i,j)返回(ai, bi, ci)(aj, bj, cj)之间的距离。是否有可能在Matlab中不使用循环编写代码?


请查看 [tag:bsxfun] 的示例。 - Shai
3个回答

1

使用 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));


1
挑战在于需要制作一个 N*N 矩阵,并且在不使用循环的情况下返回该矩阵中的结果。我通过为 Bsxfun 函数提供合适的维度来克服这个挑战。当我们调用 bsxfun 函数时,X 和 ReshapedX 默认应具有相同的维度。但是,如果矩阵的大小不相等并且其中一个矩阵具有单例(等于 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);

0

为了补充Divakar的评论:

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

在这种情况下,与pdist相比,pdist2需要大约两倍的距离计算。 - Shai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接