How can I vectorize this function with nested FOR loop?

1 次查看(过去 30 天)
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!

采纳的回答

Andrei Bobrov
Andrei Bobrov 2018-3-2
编辑:Andrei Bobrov 2018-3-2
% 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 个评论
David Franco
David Franco 2018-3-2
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 2018-3-2
I figured out:
Removing the sum command the results are the same.
Thanks!

请先登录,再进行评论。

更多回答(1 个)

per isakson
per isakson 2018-3-2
编辑:per isakson 2018-3-2
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 个评论

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 MATLAB 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by