[HELP] Vector loops :'(

Anybody knows how can i optimize this? Thanks <3!
function filter()
r=[cos(c) -sin(c);
sin(c) cos(c)];
for i = 1 : n2
for j = 1 : n1
h(i,j) = magic(r(1),std)*magic(r(2),std);
end
end
function y = magic(r,s)
y = exp(-r^2));

 Risposta accettata

Roger Stafford
Roger Stafford il 9 Apr 2015

2 voti

You have set std1 and std2 to equal values. Provided you do that, the result in 'h' is independent of the value 'c' and can be vectorized as:
n1 = 10;
n2 = 3;
s = 2
h = exp(-(((1-n2)/2:(n2-1)/2)').^2/(2*s^2))*...
exp(-(((1-n1)/2:(n1-1)/2)).^2/(2*s^2))/s^2/(2*pi);
The code can also be vectorized with unequal values of std1 and std2, but is somewhat more complicated. Do you wish to see that?

Più risposte (1)

amelia_3
amelia_3 il 9 Apr 2015
Modificato: amelia_3 il 9 Apr 2015

0 voti

Thank you!! :) Actually, I'm trying to make it with different values too. However, I don't understand your solution neither :/

1 Commento

Roger Stafford
Roger Stafford il 10 Apr 2015
Modificato: Roger Stafford il 10 Apr 2015
For unequal std1 and std2 a vectorized form would be:
[J,I] = meshgrid((1-n1)/2:(n1-1)/2,(1-n2)/2:(n2-1)/2);
cc = cos(c); sc = sin(c);
h = exp(-(cc*J-sc*I).^2/(2*std1^2)-(sc*J+cc*I).^2/(2*std2^2))...
/(std1*std2*2*pi);
To show that if std1 = std2, then the result is independent of c, the argument of exp above becomes:
-(cc*J-sc*I).^2/(2*std^2)-(sc*J+cc*I).^2/(2*std^2) =
(-(cc^2+sc^2)*J^2+(2*cc*sc-2*sc*cc)*I*J-(sc^2+cc^2)*I^2)/(2*std^2) =
-(J^2+I^2)/(2*std^2)
which is indeed independent of c.

Accedi per commentare.

Categorie

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by