我有一个包含N个3D点的Nx3阵列
a1 b1 c1
a2 b2 c2
....
aN bN cN
我想计算NxN数组中的欧几里德距离,该数组测量每对3D点之间的欧几里德距离。结果数组中的(i
,j
)会返回(ai,bi,ci)
和(aj,bj,cj)
之间的距离。是否可以在没有循环的matlab中编写代码?
答案 0 :(得分:1)
使用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 ) );
答案 1 :(得分: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);
答案 2 :(得分:0)
完成Divakar的评论:
x = rand(10,3);
pdist2(x, x, 'euclidean')