How to reduce execution time without using FOR loops?

1 view (last 30 days)
while(error>0.01)
iter = iter+1;
% for i = 2:1:xdim-1 % 57 secs
% for j = 2:1:ydim-1
% v_now(i,j) = (v_now(i-1,j)+v_now(i,j-1)+v_now(i+1,j)+v_now(i,j+1))/4;
% end
% end
j = 2:xdim-1;
i = 2:xdim-1;
v_now(i,j) = (v_now(i-1,j)+v_now(i,j-1)+v_now(i+1,j)+v_now(i,j+1))/4;
error = max(max(abs(v_now-v_prev)));
v_prev = v_now;
end;

Answers (1)

dpb
dpb on 16 Aug 2014
Edited: dpb on 16 Aug 2014
Can replace the computation of v_now with conv2
>> a=rand(5);
>> for i=2:4,for j=2:4,b(i,j)=(a(i-1,j)+a(i,j-1)+a(i+1,j)+a(i,j+1))/4;end,end
>> f=[0 1 0;1 0 1;0 1 0]/4
f =
0 0.2500 0
0.2500 0 0.2500
0 0.2500 0
>> conv2(a,f,'valid')
ans =
0.6302 0.4538 0.5160
0.5800 0.7296 0.7551
0.7276 0.8768 0.8236
>> b
b =
0 0 0 0
0 0.6302 0.4538 0.5160
0 0.5800 0.7296 0.7551
0 0.7276 0.8768 0.8236
Also, when compute error, can avoid the nested max call by using
max(abs(v_now(:)-v_prev(:))
Whether it'll make any appreciable difference, don't know otomh...

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!