[Scilab-users] Avoiding a loop
Samuel Gougeon
sgougeon at free.fr
Wed May 10 23:30:24 CEST 2017
Le 10/05/2017 à 17:25, Frieder Nikolaisen a écrit :
>
> There was a piece of code missing:
>
> P = [
> 1, 0;
> 2, 50;
> 5, 110;
> 10, 80;
> 11, 200
> 15, 0];
>
> batt = 1000;
> gen = 0;
>
> n = 1
> for n=1:5
>
> if P(n,2) > 100 then
> if batt > 800 then batt = batt - P(n,2) * (P(n+1,1) - P(n,1))
> else
> gen = gen + P(n,2) * (P(n+1,1) - P(n,1))
> end
>
> else
> batt = batt - P(n,2) * (P(n+1,1) - P(n,1))
> end
> disp('n ' + string(n))
> disp('batt ' + string(batt))
> disp('gen ' + string(gen))
> end
>
> Am 2017-05-10 17:23, schrieb Frieder Nikolaisen:
>
>> Hello,
>>
>> I did write an example code, but I do not like the time consuming way
>> I solved the problem. With 50 000 lines in the matrix, it wouldn't be
>> fun.
>>
>> How can I avoid using the for-loop?
>>
>> 10, 80;
>> 11, 200
>> 15, 0];
>>
>> batt = 1000;
>> gen = 0;
>>
>> n = 1
>> for n=1:5
>>
>> if P(n,2) > 100 then
>> if batt > 800 then batt = batt - P(n,2) * (P(n+1,1) - P(n,1))
>> else
>> gen = gen + P(n,2) * (P(n+1,1) - P(n,1))
>> end
>>
>> else
>> batt = batt - P(n,2) * (P(n+1,1) - P(n,1))
>> end
>> disp('n ' + string(n))
>> disp('batt ' + string(batt))
>> disp('gen ' + string(gen))
>> end
It may be compacted with:
P = [ 1. 2. 5. 10. 11. 15.
0. 50. 110. 80. 200. 0. ]';
batt = 1000;
gen = 0;
terms = P(1:$-1,2) .* (P(2:$,1) - P(1:$-1,1));
for n = 1:5
if P(n,2) <= 100 | batt > 800 then
batt = batt - terms(n);
else
gen = gen + terms(n);
end mprintf("n = %d batt = %d gen = %d\n", n, batt, gen);
end
Then, as told by Tim, since the condition on batt may change batt
according to n,
it is hard to go on without the loop.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/users/attachments/20170510/259bab9a/attachment.htm>
More information about the users
mailing list