2013-03-04 4 views
1

Я стараюсь изо всех сил не использовать циклы. Но мне очень сложно решить это, кроме использования петель. Можно ли векторизовать код цикла? СпасибоВекторизация Matlab Loops

a=[0.1361,0.8530,0.0760;0.8693,0.6221,0.2399;0.5797,0.3510,0.1233;.5499,0.5132,0.1839; 0.1450,0.4018,0.2400]; 
b=[0.4173,0.4893,0.7803;0.0497,0.3377,0.3897;0.9027,0.9001,0.2417;0.9448,0.3692,0.4039;0.4909,0.1112,0.0965]; 
[m1,n1,l]=size(a); 
awe=-0.5; 
g = [81.2379 92.4675;92.4675 118.1451]; 
ver=inv(g); 
p=zeros(m1,n1); 
for i=1:m1 
for j=1:n1 
    CD=[a(i,j) ; b(i,j)] 
    p(i,j)= CD'*ver* CD; 
end 
end 
q = exp(awe*p); 

ответ

1

Конечно, вы можете это сделать.

CD = reshape(diag([a(:),b(:)]*ver*[a(:),b(:)]'),5,3); 

Но только диагональ

[a(:),b(:)]*ver*[a(:),b(:)]' 

необходим.

Так заменить

diag([a(:),b(:)]*ver*[a(:),b(:)]') 

с:

sum( [a(:),b(:)]' .* (ver*[a(:),b(:)]') , 1)' 
+0

Большое вам спасибо :), я пробовал его с матрицей 320x220 и, конечно же, быстро .. спасибо вам снова. ~~ – yoname

3

Ну, разбив матрицу p вниз на несколько компонентов позволяет векторизации вычисления следующим образом:

p = a .^ 2 * ver(1, 1) + a .* b * (ver(1, 2) + ver(2, 1)) + b .^ 2 * ver(2, 2); 

В качестве альтернативы , вы можете обобщить решение следующим образом:

CD = [a(:), b(:)]'; 
p = reshape(diag(CD' * ver * CD), size(a)); 

Обратите внимание, что это немного более медленное решение.

+1

Большое вам спасибо за подсказки :) – yoname

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