Conditional cumsum - how to create?

3 ビュー (過去 30 日間)
Eric Sampson
Eric Sampson 2013 年 4 月 2 日
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 件のコメント
the cyclist
the cyclist 2013 年 4 月 2 日
It would be useful if you also described conceptually what you are trying to do.
Eric Sampson
Eric Sampson 2013 年 4 月 2 日
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 :)

サインインしてコメントする。

採用された回答

Roger Stafford
Roger Stafford 2013 年 4 月 2 日
Try this.
outp = cumsum([inp(1);min(diff(inp),0)]);
  1 件のコメント
Eric Sampson
Eric Sampson 2013 年 4 月 2 日
Ding ding ding! Roger wins, to Matt's detriment :) Thanks!

サインインしてコメントする。

その他の回答 (1 件)

Matt Tearle
Matt Tearle 2013 年 4 月 2 日
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 件のコメント
Sean de Wolski
Sean de Wolski 2013 年 4 月 2 日
As you know, the DWIM Toolbox still hasn't been released to the public.
Eric Sampson
Eric Sampson 2013 年 4 月 2 日
Sean, wasn't Loren or Steve supposed to be on that? Slackers.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeBartlett についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by