Я представляю мой простой рабочий код Matlab и будет задавать вопросы:Vectorize двойной для петель в Matlab
tic
nrand1 = 10000;
nrand2 = 20000;
% Location matrix 1: [longitude, latitude, w1]
lmat1=[rand(nrand1,1)-75 rand(nrand1,1)+39 round(rand(nrand1,1)*1000)+1];
% Location matrix 2: [longitude, latitude, w2]
lmat2=[rand(nrand2,1)-75 rand(nrand2,1)+39 round(rand(nrand2,1)*100)+1];
% The number of rows for each matrix = In fact it's nrand1 X nrand2, obviously
nobs1 = size(lmat1,1);
nobs2 = size(lmat2,1);
% The number of pair-wise distances
% between L1 locations X L2 locations
ndist = nobs1*nobs2;
% Initialization: Distance vector and weight vector
hdist = zeros(ndist,1);
weight = zeros(ndist,1);
% Double for loop -- for calculating the pair-wise distances and weights
k=1;
for i=1:nobs1
for j=1:nobs2
% distances in kilometers.
lonH = sin(0.5*(lmat1(i,1)-lmat2(j,1))*pi/180.0)^2;
latH = sin(0.5*(lmat1(i,2)-lmat2(j,2))*pi/180.0)^2;
hdist(k) = 0.001*6372797.560856*2 ...
*asin(sqrt(latH+(cos(lmat1(i,2)*pi/180.0) ...
*cos(lmat2(j,2)*pi/180.0))*lonH));
weight(k) = lmat1(i,3)*lmat2(j,3);
k=k+1;
end
end
toc
Код вычисляет 10000 X 20000 расстояния и веса.
Elapsed time is 67.124844 seconds.
Есть ли способ для векторизации обработки с двойным циклом или для выполнения параллельных вычислений? Если в Matlab нет места для улучшения производительности, мне, возможно, придется написать двойные петли в C и вызвать его из Matlab. Я не знаю, как позвонить в C из Matlab, поэтому я задам отдельный вопрос. Благодаря!
Пустые расстояния? Посмотрите на ['pdist'] (http://www.mathworks.com/help/stats/pdist.html) в Matlab, который использует код C под капотом, если вы используете одну из встроенных метрик расстояния. См. Также [этот вопрос] (http://stackoverflow.com/questions/17777292/fast-algorithms-for-finding-pairwise-euclidean-distance) и мой ответ - вы можете изменить либо мой код Matlab, либо мой mex C для ваших целей. – horchler
Что такое 'nrandom'? не можете выполнить этот код. – Marcin
Я просмотрю ваше сообщение. Спасибо. Параметры «pdist» и спецификация специальных функций могут отличаться от настроек «двух» матриц местоположения. Но я попробую. –