How can I vectorize this function with nested FOR loop?

1 Ansicht (letzte 30 Tage)
David Franco
David Franco am 2 Mär. 2018
Kommentiert: David Franco am 2 Mär. 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!

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
David Franco
David Franco am 2 Mär. 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 am 2 Mär. 2018
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
David Franco
David Franco am 2 Mär. 2018
Thanks per isakson!

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu MATLAB finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by