Вот векторизованная реализация для вычисления евклидова расстояния, которая намного быстрее, чем у вас (даже значительно быстрее, чем PDIST2 на моей машине):
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
На моем ноутбуке WinXP с R2011b мы можем наблюдать улучшение в 10 развремя:
Elapsed time is 70.939146 seconds. %# PDIST2
Elapsed time is 7.879438 seconds. %# vectorized solution
Вы должны знать, что он не дает точно тех же результатов, что и PDIST2, с наименьшей точностью. Сравнивая результаты, вы увидите небольшие различия (обычно близка к eps
относительной точности с плавающей запятой):
>> max( abs(D(:)-DD(:)) )
ans =
1.0658e-013
В дополнение к этому, я собрал около 10 различных реализаций (некоторые из них просто небольшие вариации друг друга) дляэто вычисление расстояния, и сравнивали их.Вы будете удивлены, насколько быстрыми могут быть простые циклы (благодаря JIT) по сравнению с другими векторизованными решениями ...