MATLAB Answers

Sum up values in a certain range with logical indexing (better performance)

4 views (last 30 days)
buhmatlab
buhmatlab on 7 Jun 2020
Edited: Stephen Cobeldick on 7 Jun 2020
Hi,
Since my script runs very slowly, I try to optimize the code and wonder if anybody is able help?
The (old and slow) code does the following:
In each row, the sum of all values from rows, that feature the name of the corresonding row and appear before the EventDate of the corresponding row, is calulated.
csum = zeros(size(values));
for i=1:length(values)
csum(i) = sum(values(find(Name==Name(i) & EventDate < EventDate(i))));
end
Later on, my project also requires to calculate the sum of other ranges, so for example not all values of EventDate < EventDate(i) and Name==Name(i)but only the last two values of rows row where EventDate < EventDate(i) and Name==Name(i), another example would only focus on the last value which would not need to calculate the sum at all since it is only one value.
In this case I would adjust the code:
sum(values(find(Name==Name(i) & EventDate<EventDate(i) ,n,'last')));
However, I wonder if there is any way to improve the code by avoiding loops and using for example logical indexing. The performance of the current code is by far not good enough.
Thank you so much!

  1 Comment

Stephen Cobeldick
Stephen Cobeldick on 7 Jun 2020
For the first example you can get rid of find . But for the second example, there might not be a simple alternative.

Sign in to comment.

Answers (0)


Translated by