How can I vectorize this function with nested FOR loop?

1 vue (au cours des 30 derniers jours)
David Franco
David Franco le 2 Mar 2018
Commenté : David Franco le 2 Mar 2018
The function is:
x = -10:10;
y = -5:5;
for j = 1:21
for i = 1:11
f(i) = - 20 * exp( - 0.2 * sqrt( ( 1/2 ) * sum( x(j)^2 + y(i)^2 ) ) );
end
z(j,:) = f;
end
Thanks!

Réponse acceptée

Andrei Bobrov
Andrei Bobrov le 2 Mar 2018
Modifié(e) : Andrei Bobrov le 2 Mar 2018
% MATLAB >= R2016b
z = - 20 * exp( - 0.2 * sqrt( .5 * sum( x(:).^2 + y(:)'.^2 ) ) );
% MATLAB <= R2016a
[xx,yy] = ndgrid(x,y);
z = - 20 * exp( - 0.2 * sqrt( .5 * sum( xx.^2 + yy.^2 ) ) );
  2 commentaires
David Franco
David Franco le 2 Mar 2018
Thanks for the answer Andrei, but the results are different:
In the original code z = 21x11
In your codes z = 1x11
Any suggestions on how to fix this?
David Franco
David Franco le 2 Mar 2018
I figured out:
Removing the sum command the results are the same.
Thanks!

Connectez-vous pour commenter.

Plus de réponses (1)

per isakson
per isakson le 2 Mar 2018
Modifié(e) : per isakson le 2 Mar 2018
Yes, try this
>> max( cssm, [], 1 )
ans =
0 0 0 0 0 0 0 0 0 0 0
>>
where
function dz = cssm()
x = -10:10;
y = -5:5;
f = nan(1,11);
z = nan(21,11);
%
for j = 1:21
for i = 1:11
f(i) = - 20 * exp( - 0.2 * sqrt( ( 1/2 ) * sum( x(j)^2 + y(i)^2 ) ) );
end
z(j,:) = f;
end
vectorized version
x02 = repmat( reshape( x, [], 1 ), 1,length(y) );
y02 = repmat( y, length(x),1 );
z02 = - 20 * exp( - 0.2 * sqrt( ( 1/2 ) * ( x02.^2 + y02.^2 ) ) );
%
dz = abs( z02 - z );
end
on R2016a
btw: Isn't true that sum in this case has no effect?
  3 commentaires
per isakson
per isakson le 2 Mar 2018
David Franco
David Franco le 2 Mar 2018
Thanks per isakson!

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by