Help to vectorise a conditional cumulative sum
Show older comments
If you have any time, I need some help vectorizing! Racking my brains, and I can’t figure out a way!
I have two vectors of length m: L and W. L contains a vector of lengths, and W contains a vector of corresponding widths. I would like to make a third vector, C, which is the cumulative total of the elements of L subject to the corresponding W being less than the current value of W. i.e. if W(j)<W(i) for j<i, then include L(j) in the sum, if not, then exclude it from the sum.
I can easily do this using a for loop:
C(1) = 0;
for i = 2:m
C(i) = sum(L(1:i-1).*(W(1:i-1)<W(i)))
end
however, I cannot think of a way to vectorize this. Can anyone think of a way?
Thanks, Ric
Answers (1)
Andrei Bobrov
on 21 Nov 2017
C = sum(tril(W(:) > W(:)',-1).*L(:)',2);
3 Comments
Ric Porteous
on 21 Nov 2017
Andrei Bobrov
on 22 Nov 2017
Edited: Andrei Bobrov
on 22 Nov 2017
In case use largest arrays your variant with use loop effecient than my variant.
Stephen23
on 22 Nov 2017
@Ric Porteous: there is no guarantee that vectorized code is more efficient. As you have just found out, when very large intermediate arrays must be created then it is quite possible that a loop is faster.
Do some timing test and decide for yourself. Keep in mind code complexity/comprehensibility and future memory improvements.
Categories
Find more on Performance and Memory 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!