Conditional cumsum - how to create?

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;
else
output(ind) = output(ind-1);
end
end

2 Commenti

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 :)

Accedi per commentare.

 Risposta accettata

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

1 Commento

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

Accedi per commentare.

Più risposte (1)

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)

5 Commenti

Matt that looks promising, but I don't think it generates the same results as the algorithm?
I copy/pasted your code and checked mine against it:
input = rand(100000,1);
tic
output = zeros(size(input));
output(1) = input(1);
for ind = 2:numel(input)
if (input(ind) - input(ind-1)) < 0
output(ind) = input(ind);
else
output(ind) = output(ind-1);
end
end
t1=toc;
tic
d = [true;diff(input)<0];
idx = find(d);
output2 = input(idx(cumsum(d)));
t2=toc;
max(abs(output-output2))
t1/t2
I always seem to get a difference of 0.
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.

Accedi per commentare.

Categorie

Scopri di più su Deep Learning Toolbox in Centro assistenza e File Exchange

Prodotti

Community Treasure Hunt

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

Start Hunting!

Translated by