removing three loops which are predeterminded

1 view (last 30 days)
Hi all
I've writen a program including four loops and they all located inside a "while" loop as below:
q=[0,10,20; 40,50,60; 10,20,30;] ;
s=[0;10;20;30];
r=[10;20;30;40];
nq=size(q,2);
ns=length(s);
nr=length(r);
n=1;
while n<10000
for t=3:-1:1
for ss=1:ns
for qq=1:nq
for rr=1:nr
s2{t,ss}(qq,rr)= s(ss)+q(t,qq)-r(rr);
if s2{t,ss}(qq,rr)<=100 && s2{t,ss}(qq,rr)>=0
tsd{t,ss}(qq,rr)=10^25;
else
s2{t,ss}(qq,rr)=-1e6;tsd{t,ss}(qq,rr)=-1e25;
end
end
end
end
n=n+1;
end
end
since the values of "ss", " qq" and "rr" are predeterminded, I want to vectorize above programand and finally decrease the number of loops by removing "ss","qq" and "rr" loops, respectively.
How can I remove three mentioned loops in the way all results related to "s2" and "tsd" be visible sepratly. any help would be appreciated.
  10 Comments
Walter Roberson
Walter Roberson on 31 Mar 2012
som, if you create answers faster if the question contains an "urgent", then that must be on some other forum, as you have not answered any questions at all here.
Jan
Jan on 1 Apr 2012
@Walter: "Faster" can be related to an event in the future also.

Sign in to comment.

Accepted Answer

Jan
Jan on 31 Mar 2012
I do not see a method to avoid all loops. And even if this is possible, it is not guaranteed to be more efficient.
Anyhow, you can improve the current version:
s2 = cell(3, ns); % Pre-allocate!
tsd = cell(3, ns);
while n<10000
for t = 3:-1:1
a = bsxfun(@minus, q(t, :)', r);
for ss = 1:ns
b = s(ss) + a;
index_out = b > 100 | b < 0;
% index_in is not needed!
% index_in = s2{t,ss} <= 100 & s2{t,ss} >= 0;
% But if it is needed: index_in = not(index_out);
b(index_out) = -1e6;
s2{t, ss} = b;
tsd{t, ss}(index_out) = -1e25;
end
n = n+1;
end
end
  2 Comments
som
som on 31 Mar 2012
thanks.In your idea there is no solution for removing all three loops containing "ss", " qq" and "rr" loops?
thanks
Jan
Jan on 1 Apr 2012
No, I did not try to remove all loops, because I do not assume, that this will be an improvement. In general the removing of a loop requires the creation of an temporary array. The larger the temporary arrays, the smaller is the benefit of vectorizing. With pre-allocation a FOR-loop can be the fastest method.

Sign in to comment.

More Answers (1)

som
som on 3 Apr 2012
Dear Jan Simon,
since writing of above program by keeping just one loop i.e. " t loop" is so essential for me and on the other hand it's a main part of my project, could you please try for it and give me your valuable feedback. thanks
  1 Comment
Jan
Jan on 3 Apr 2012
Dear som, I'm convinced that a fully vectorized method is slower than the shown code, especially if you store the data in form of cells in s2 and tsd. I cannot understand, why you want to avoid the loop and in consequence I cannot guess the requirements of the new code.
There is still a potential for further accelerations in the code. E.g.:
b = s(ss) + a;
index_out = b > 100 | b < 0;
can be expressed as:
index_out = abs(s(ss) + a - 50) > 50;
However, without knowing what you actually want to achieve, further suggestions are guesswork only.

Sign in to comment.

Categories

Find more on Simulink in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!