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!

 Akzeptierte Antwort

Andrei Bobrov
Andrei Bobrov am 2 Mär. 2018
Bearbeitet: Andrei Bobrov am 2 Mär. 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 Kommentare

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!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

per isakson
per isakson am 2 Mär. 2018
Bearbeitet: per isakson am 2 Mär. 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 Kommentare

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!

Melden Sie sich an, um zu kommentieren.

Kategorien

Community Treasure Hunt

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

Start Hunting!

Translated by