Is there any alternative to if statements inside for loops?

Hello, my code has many parts like this :
for i=1:8760
for j=1:Ni
if Ns*Vm(i) < Vi_min
Pin(i,j) = 0;
else
if year==1
r_y=0;
else
r_y=r_pv;
end
eta_m=eta_mppt(Ns*Np*Pm(i));
Pin(i,j) = (1 - As_I(i,j)*SIF/Ns*Np*Lpv1*Lpv2)*(1-n_l_dc*PL_dc)*Ns*Np*eta_m*(1 - r_y*year)*Pm(i);
end
end
end
It takes a long time to execute due to the if statement inside for loops. I would like to ask if there is an alternate implementation to that. Thanks

1 Comment

Please use formatting for your question so we can read the code.

Sign in to comment.

 Accepted Answer

1) logical indexing
2) Ns, Vm(i), vi_min are all invariant in your "j" loop, so there is no point doing the "j" loop in that condition. Likewise, eta_m is independent of j.
if Ns*vm(i) < Vi_min
Pin(i,1:ni) = 0;
else
eta_m=eta_mppt(Ns*Np*Pm(i));
for j = 1 : Ni
....
end
end

More Answers (3)

Do you pre-allocated "Pin", if not... then before the for-loops put:
Pin = zeros(8760,Ni);
The inside of your for-loops will become:
if Ns*Vm(i) >= Vi_min
if year==1
r_y=0;
else
r_y=r_pv;
end
eta_m=eta_mppt(Ns*Np*Pm(i));
Pin(i,j) = (1 - As_I(i,j)*SIF/Ns*Np*Lpv1*Lpv2)*...
(1-n_l_dc*PL_dc)*Ns*Np*eta_m*(1 - r_y*year)*Pm(i);
end
That should help run-time a bit.
The if -condition does not depend on the counter of the inner loop:
for j=1:Ni
if Ns*Vm(i) < Vi_min
Then you can move it outside:
if Ns*Vm(i) >= Vi_min
for j=1:Ni
The pre-allocation mentioned by Elige will be more important.
Thanks a lot!! , there has been a great improvement. Last question , is there anything else that can be done about those 4 for loops? I appreciate your help.
for i=1:8760
for j=1:Ni
if Pin(i,j)>Pi_sc
if Pin(i,j)<=Pi_na(i)
eta=eta_inv(Pin(i,j));
Po(i,j) = eta*Pin(i,j);
else
eta=eta_inv(Pi_na(i));
Po(i,j) = eta*Pi_na(i);
end
else Po(i,j) = 0;
end
end
end
for i=1:8760
if P_plant(i)>P_plant_max
P_plant(i) = P_plant_max;
end
end
for i=1:8760
if P_plant(i) > P_grid_max(i)*(1 + (year-1)*Sg)
P_plant(i) = P_grid_max(i)*(1 + (year-1)*Sg);
end
end
for i=1:8760
for j=1:Ni
if Pin(i,j) < 0
Pin(i,j) = 0;
end
end
end

1 Comment

Well, for example, you can replace
for i=1:8760
if P_plant(i)>P_plant_max
P_plant(i) = P_plant_max;
end
end
with
P_plant = min(P_plant, P_plant_max);
with no loop.
Likewise, consider
Pin = max(Pin,0);

Sign in to comment.

Categories

Find more on Loops and Conditional Statements 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!