MATLAB Answers

Eric Sampson

Conditional cumsum - how to create?

Asked by Eric Sampson
on 2 Apr 2013

This is probably easy, but my brain isn't working today...

How can you do the following operation in a vectorized way? I'd think it should be possible with some combination of cumsum, diff & logical indexing:

input = rand(10,1);
output = zeros(size(input);
output(1) = input(1);
for ind = 2:numel(input)
  dif = input(ind) - input(ind-1);
   if dif < 0
      output(ind) = output(ind-1) + dif;
      output(ind) = output(ind-1);


It would be useful if you also described conceptually what you are trying to do.

Basically it's a copy of the input, but anytime that the original increases from one val to the next, the output should be hold constant. Sort of like a copy that can only go down :)


2 Answers

Answer by Roger Stafford
on 2 Apr 2013
 Accepted answer

Try this.

 outp = cumsum([inp(1);min(diff(inp),0)]);

  1 Comment

Ding ding ding! Roger wins, to Matt's detriment :) Thanks!

Answer by Matt Tearle
on 2 Apr 2013

There may be better ways, but this works:

d = [true;diff(input)<0];
idx = find(d);
output = input(idx(cumsum(d)));

When the array is large enough, there's a pretty decent speedup (~50x)


Argh, I'm sorry Matt. See my revised problem statement. This was clearly a case of 'do what I mean, not what I say' :)

As you know, the DWIM Toolbox still hasn't been released to the public.

Sean, wasn't Loren or Steve supposed to be on that? Slackers.

Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

MATLAB Academy

New to MATLAB?

Learn MATLAB today!