эквивалент pdist2 в версии 7 MATLAB

Мне нужно вычислить эвклидовое расстояние между 2 matrixми в матлабе. В настоящее время я использую bsxfun и вычисляя расстояние, как показано ниже (я прикрепляю fragment кода):

for i=1:4754 test_data=fea_test(i,:); d=sqrt(sum(bsxfun(@minus, test_data, fea_train).^2, 2)); end 

Размер fea_test равен 4754×1024, а fea_train – 6800×1024, использование цикла for приводит к тому, что выполнение команды займет примерно 12 минут, что, по моему мнению, слишком велико. Есть ли способ быстрее вычислить эвклидовое расстояние между обеими matrixми?

Мне сказали, что, удалив ненужные циклы, я могу сократить время выполнения. Я также знаю, что pdist2 может помочь сократить время вычисления, но поскольку я использую версию 7. matlab, у меня нет функции pdist2. Обновление не является вариантом.

Любая помощь.

С Уважением,

Бхавайя

Вы можете полностью векторизовать вычисления, повторяя строки fea_test 6800 раз, а fea_train 4754 раза, например:

 rA = size(fea_test,1); rB = size(fea_train,1); [I,J]=ndgrid(1:rA,1:rB); d = zeros(rA,rB); d(:) = sqrt(sum(fea_test(J(:),:)-fea_train(I(:),:)).^2,2)); 

Однако это привело бы к промежуточным массивам размером 6800x4754x1024 (* 8 байтов для парных разрядов), которые занимают ~ 250 ГБ ОЗУ. Таким образом, полная векторизация не будет работать.

Однако вы можете сократить время вычисления расстояния путем предварительного распределения и не вычислять квадратный корень до того, как это необходимо:

 rA = size(fea_test,1); rB = size(fea_train,1); d = zeros(rA,rB); for i = 1:rA test_data=fea_test(i,:); d(i,:)=sum( (test_data(ones(nB,1),:) - fea_train).^2, 2))'; end d = sqrt(d); 

Вот векторная реализация для вычисления евклидова расстояния, которая намного быстрее, чем у вас (даже значительно быстрее, чем PDIST2 на моей машине):

 D = sqrt( bsxfun(@plus,sum(A.^2,2),sum(B.^2,2)') - 2*(A*B') ); 

Он основан на том, что: ||uv||^2 = ||u||^2 + ||v||^2 - 2*uv


Рассмотрим ниже грубое сравнение двух методов:

 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), по сравнению с другими векторизованными решениями …

Попробуйте эту векторизованную версию, она должна быть довольно эффективной. Изменить: только что заметил, что мой ответ похож на @ Amro.

 function K = calculateEuclideanDist(P,Q) % Vectorized method to compute pairwise Euclidean distance % Returns K(i,j) = sqrt((P(i,:) - Q(j,:))'*(P(i,:) - Q(j,:))) [nP, d] = size(P); [nQ, d] = size(Q); pmag = sum(P .* P, 2); qmag = sum(Q .* Q, 2); K = sqrt(ones(nP,1)*qmag' + pmag*ones(1,nQ) - 2*P*Q'); end 
Interesting Posts

Безопасность Java: недопустимый размер ключа или параметры по умолчанию?

Запуск 32-разрядных и 64-разрядных программ в 64-разрядной ОС

Трюки для ускорения времени запуска? Windows 7

проверьте, была ли включена блокировка или нет.

Как закрыть окно поиска в Firefox с помощью сочетания клавиш, когда это поле не в фокусе?

Доступ запрещен при записи файлов на сетевой диск

Эффект Hover: расширение нижней границы

Две клавиатуры на одном компьютере. Когда я пишу с AI, хочу иметь раскладку клавиатуры в США, когда я использую BI, хочу шведский. Возможное?

Сервер WAMP не работает должным образом в Windows 10

Как проверить мой сервлет с помощью JUnit

USB-накопитель, который одновременно подключается к нескольким компьютерам

Spring-Data-Jpa Repository – Подчеркивание имени столбца объекта

Программно создавать сертификат X509 с использованием OpenSSL

MSBuild в решении TeamCity для Visual Studio 2012

Проблема большого набора данных EPPlus с отсутствием памяти

Давайте будем гением компьютера.