How can I vectorize this function with nested FOR loop?

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!

 Risposta accettata

Andrei Bobrov
Andrei Bobrov il 2 Mar 2018
Modificato: Andrei Bobrov il 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 Commenti

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?
I figured out:
Removing the sum command the results are the same.
Thanks!

Accedi per commentare.

Più risposte (1)

per isakson
per isakson il 2 Mar 2018
Modificato: per isakson il 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 Commenti

It worked, but how can I extrapolate to higher dimensions?
Ackley's Function:
z = -20*exp(-0.2*sqrt((1/d)*sum(x^2)))-exp((1/d)*sum(cos(2*pi*x)))+20+exp(1);
where d is the dimension of the input.
Thanks!
Thanks per isakson!

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