2012-04-29 8 views
0

Вот фрагмент кода Matlab. Он работает очень медленно. Есть ли способ заставить его работать быстрее? Я не могу определить способ его векторизации. Может быть, он может быть написан как какой-то фильтр?Matlab loops vectorization

... 
for uu=2:length(x)-2; 
    for vv= 2:length(y)-2; 

    P1=[x(uu+1) y(vv) temp(uu+1,vv)]; 
    P2=[x(uu) y(vv+1) temp(uu,vv+1)]; 
    P3=[x(uu-1),y(vv) temp(uu-1,vv)]; 
    P4=[x(uu) y(vv-1) temp(uu,vv-1)]; 


    cr=cross((P1-P3),(P2-P4)); 

    cr=cr/norm(cr); 
    theta=acos(dot([0,0,1],px))*180/pi; 
    ... 
end 
end 
... 
+1

Что такое 'px'? 'theta', кажется, определяется независимо от всего остального. – yohai

+0

Каков результат, который вы пытаетесь достичь? С вложенным циклом вы, вероятно, хотите какой-то 2d-выход, но невозможно сказать, поскольку пример стоит – learnvst

ответ

0

Для векторизации этого вложенного цикла необходимо правильно изменить данные. Кросс-продукт может быть выполнен по определенному размеру, поэтому все, что вам действительно нужно сделать, - это преобразовать P1 ... P4 в векторы, содержащие ваши данные, хорошо упорядоченные.

Обратите внимание, что у вас есть «крестообразное» ядро ​​для вашей работы. P1 может быть нижней частью, P3 - верхней частью, P2 - правой частью, а P4 - левой. Предполагая, что векторы х и у являются только координаты выбранных точек (TEMP), каждый из этих векторов можно представить следующим образом:

[x,y] = meshgrid(1:size(temps,1),1:size(temp,2)); % Create a sampling grid or replicate the one you have 

tmp1 = x(3:end,2:end-1); 
tmp2 = y(3:end,2:end-1); 
tmp3 = temp(3:end,2:end-1); 
P1 = [tmp1(:), tmp2(:), tmp3(:)] % Vectorization 

tmp1 = x(2:end-1,3:end); 
tmp2 = y(2:end-1,3:end); 
tmp3 = temp(2:end-1,3:end); 
P2 = [tmp1(:), tmp2(:), tmp3(:)]; 

tmp1 = x(1:end-2,2:end-1); 
tmp2 = y(1:end-2,2:end-1); 
tmp3 = temp(1:end-2,2:end-1); 
P3 = [tmp1(:), tmp2(:), tmp3(:)]; 

tmp1 = x(2:end-1,1:end-2); 
tmp2 = y(2:end-1,1:end-2); 
tmp3 = temp(2:end-1,1:end-2); 
P4 = [tmp1(:), tmp2(:), tmp3(:)]; 

V1 = P1 - P3; 
V2 = P2 - P4; 

CR = cross(V1,V2); 
NRM = (CR(:,1).^2 + CR(:,2).^2 + CR(:,3).^2).^0.5; % norm(X) cannot be vectorized 
CR = CR./NRM; 

Theta, кажется, не зависит от каких-либо переменных в цикле, но acos (X) и точка (v1, v2) могут использоваться с векторизованными данными, такими же, как cross (v1, v2).

Я сомневаюсь, что вы можете получить повышение производительности от разложения функции кросс-продукта в расширении кофактора или попытаться реализовать его как некий нелинейный фильтр. Если он все еще слишком медленный, вы должны взглянуть на панель инструментов Parallel.

Надеюсь, это поможет!

Смежные вопросы