这是用于计算欧几里得距离的矢量化实现,它比您所拥有的要快得多(甚至比您所拥有的快得多)PDIST2 http://www.mathworks.com/help/toolbox/stats/pdist2.html在我的机器上):
D = sqrt( bsxfun(@plus,sum(A.^2,2),sum(B.^2,2)') - 2*(A*B') );
它基于以下事实:||u-v||^2 = ||u||^2 + ||v||^2 - 2*u.v
下面对两种方法进行粗略比较:
A = rand(4754,1024);
B = rand(6800,1024);
tic
D = pdist2(A,B,'euclidean');
toc
tic
DD = sqrt( bsxfun(@plus,sum(A.^2,2),sum(B.^2,2)') - 2*(A*B') );
toc
在我运行 R2011b 的 WinXP 笔记本电脑上,我们可以看到时间缩短了 10 倍:
Elapsed time is 70.939146 seconds. %# PDIST2
Elapsed time is 7.879438 seconds. %# vectorized solution
你应该知道它并没有给出exactly与 PDIST2 相同的结果到最小精度。通过比较结果,您会看到微小的差异(通常接近eps
浮点相对精度):
>> max( abs(D(:)-DD(:)) )
ans =
1.0658e-013
附带说明一下,我为这个距离计算收集了大约 10 种不同的实现(其中一些只是彼此的微小变化),并对它们进行了比较。与其他矢量化解决方案相比,您会惊讶于简单循环的速度有多快(感谢 JIT)...