我有一个Nx3的数组,其中包含N个三维点
a1 b1 c1
a2 b2 c2
....
aN bN cN
我希望能够在一个NxN的数组中计算欧几里得距离,该距离衡量每对3D点之间的欧几里得距离。结果数组中的(i
,j
)返回(ai, bi, ci)
和(aj, bj, cj)
之间的距离。是否有可能在Matlab中不使用循环编写代码?
我有一个Nx3的数组,其中包含N个三维点
a1 b1 c1
a2 b2 c2
....
aN bN cN
我希望能够在一个NxN的数组中计算欧几里得距离,该距离衡量每对3D点之间的欧几里得距离。结果数组中的(i
,j
)返回(ai, bi, ci)
和(aj, bj, cj)
之间的距离。是否有可能在Matlab中不使用循环编写代码?
使用 pdist
和 squareform
:
D = squareform( pdist(X, 'euclidean' ) );
对于初学者来说,使用bsxfun(悬停以查看解决方案)计算距离矩阵D
可以是一个不错的练习。
elemDiff = bsxfun(@minus, permute(X,[1 3 2]), permute(X,[3 1 2]));
D = sqrt(sum(elemDiff.^2, 3));
ReshapedX = permute(X,[3,2,1]);
DiffX = bsxfun(@minus,X,ReshapedX);
DistX =sqrt(sum(DiffX.^2,2));
D = squeeze(DistX);
为了补充Divakar的评论:
x = rand(10,3);
pdist2(x, x, 'euclidean')
pdist
相比,pdist2
需要大约两倍的距离计算。 - Shai