Replacing for loop in order to decrease run time
1 view (last 30 days)
Show older comments
I'm trying to add the difference between 2 arrays (if A(i) > B(i)) to the next element of array A. I'm unsure how to decrease the time needed to run this code (it'll be integrated using ode45)
for i = 1:length_chain_classes
if Rate_array(i) > ChainLengths(i) %% if more glucose gets designated to class than it can accept, at surplus to next class
Surplus_g1p = Rate_array(i) - ChainLengths(i);
Rate_array(i) = ChainLengths(i);
if i ~= length(Rate_array) %% voids surplus only if at last class
Rate_array(i+1) = Rate_array(i+1) + Surplus_g1p;
end
end
end
I'm unsure how to reference the next/previous value in a vector without using a for loop
2 Comments
Tommy
on 24 Apr 2020
It seems like the order in which this loop runs does matter, as you might change Rate_array(i+1) on one iteration, thereby changing the result of Rate_array(i) > ChainLengths(i) on the next iteration. Therefore, vectorizing this code may leave you with incomplete results. You could solve the issue by rerunning the code until you know you're done, demonstrated below using sample A and B vectors:
A = randi(10,10,1);
B = randi(10,10,1);
i = A>B;
while any(i)
sg = A-B;
A(i) = B(i);
A([false; i(1:end-1)]) = A([false; i(1:end-1)]) + sg([i(1:end-1); false]);
i = A>B;
end
There may be a better way. This at least shows how you can "reference the next/previous value in a vector without using a for loop."
Answers (1)
Athul Prakash
on 30 Apr 2020
Hi Bastiaan,
I think this way you can solve it. Below is how yo
D = A(1, end-1) - B(1, end-1);
D = [0; D] % ';' Assuming A & B are col vectors. Otherwise use ','
A = A + D;
Hope it helps!
0 Comments
See Also
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!