How do I Vectorize the for loop containing if else statements?
Mostrar comentarios más antiguos
Hi!
I have a following code snippet containing for loop and if-else statements, I wish to change it into vectorized version for better computational speed.
for k=2:1:length(L)
if TREG(k) >= L(k)
if TREG(k) > L(k)
P_ch(k)=((TREG(k)-L(k))*(BT_eff));
E_ch(k)=P_ch(k).*1;
d1(k)=(SOC_bat_max-SOC_bat(k-1));
if E_ch(k) <= (d1(k))
SOC_bat(k)=SOC_bat(k-1)+E_ch(k);
if SOC_bat(k) > SOC_bat_max
SOC_bat(k)=SOC_bat_max;
E_dump(k)=E_ch(k)-(d1(k));
else
E_dump(k)=0;
end
else
SOC_bat(k)=SOC_bat_max;
E_dump(k)=E_ch(k)-(d1(k));
end
time1(k)=1;
else
SOC_bat(k)=SOC_bat(k-1);
end
elseif L(k) > TREG(k)
P_dh(k)=((L(k)-TREG(k))/(BT_eff));
E_dh(k)=P_dh(k).*1;
diff(k)=SOC_bat(k-1)-SOC_bat_min;
if (diff(k)) >= E_dh(k)
E_dh1(k)=E_dh(k);
SOC_bat(k)= (SOC_bat(k-1))-E_dh(k);
time1(k)=2;
elseif (diff(k)) < E_dh(k)
E_dh1(k)=E_dh(k);
if diff(k)~=0
SOC_bat(k)= E_dh(k)-(diff(k));
else
SOC_bat(k)=SOC_bat(k-1);
end
if E_dh(k)>0
LSBG(k)=E_dh(k);
RPOG(k)=(P_grid*1)-E_dh(k);
P_grid_out(k)=LSBG(k)*1;
end
SOC_bat(k)=SOC_bat(k);
end
if SOC_bat(k) < SOC_bat_min
SOC_bat(k)=SOC_bat_min;
elseif SOC_bat(k) > SOC_bat_max
SOC_bat(k)=SOC_bat_max;
end
end
end
I have tried the following version:
if (TREG > L) == 1
P_ch(TREG > L)=0;
P_ch(:)=((TREG-L)*(BT_eff));
E_ch=P_ch.*1;
d1(TREG >= L & TREG > L)=(SOC_bat_max-SOC_bat);
SOC_bat(TREG >= L & TREG > L & E_ch <= (d1))=SOC_bat+E_ch(k);
SOC_bat(TREG >= L & TREG > L & E_ch <= (d1) & SOC_bat > SOC_bat_max)=SOC_bat_max;
E_dump(TREG >= L & TREG > L & E_ch <= (d1) & SOC_bat > SOC_bat_max)=E_ch-(d1);
E_dump(TREG >= L & TREG > L & E_ch <= (d1) & SOC_bat < SOC_bat_max)=0;
SOC_bat(TREG >= L & TREG > L & E_ch >= (d1))=SOC_bat_max;
E_dump(TREG >= L & TREG > L & E_ch >= (d1))=E_ch-(d1);
SOC_bat(TREG < L)=SOC_bat;
%---------------------------------------------------------------------------
elseif (L > TREG) == 1
%---------------------------------------------------------------------------
P_dh(:)=((L-TREG)./(BT_eff));
P_dh(L > TREG)=0;
E_dh=P_dh.*1;
diff(L > TREG)=(SOC_bat-SOC_bat_min);
SOC_bat(diff>E_dh)=SOC_bat-E_dh(k);
SOC_bat(L > TREG & diff < E_dh & diff ~=0)= E_dh-diff;
SOC_bat(L > TREG & diff < E_dh & diff ==0)= SOC_bat;
LSBG(L > TREG & diff < E_dh & E_dh >0)=E_dh;
RPOG(L > TREG & diff < E_dh & E_dh >0)=(P_grid.*1)-E_dh;
P_grid_out(L > TREG & diff < E_dh & E_dh >0)=LSBG.*1;
SOC_bat(L > TREG & diff < E_dh)=SOC_bat;
SOC_bat(L > TREG & SOC_bat < SOC_bat_min)=SOC_bat_min;
SOC_bat(L > TREG & SOC_bat > SOC_bat_max)=SOC_bat_max;
%---------------------------------------------------------------------------
end
But I am stuck this error, I understand the error. However, I have not found any way to resolve it.
Error @ above code snippet(vectorized version) ( Line: P_dh(:)=((L-TREG)./(BT_eff)) ):
"Error using gpuArray/subsasgn
In an assignment A(:) = B, the number of elements in A and B must be the same."
Please help..
Thak You
Respuesta aceptada
Más respuestas (0)
Categorías
Más información sobre Loops and Conditional Statements en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!