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

3 Ansichten (letzte 30 Tage)
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 Kommentar
Stephen23
Stephen23 am 7 Jun. 2020
Bearbeitet: Stephen23 am 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.

Melden Sie sich an, um zu kommentieren.

Antworten (0)

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by