Conditional cumsum - how to create?

조회 수: 1 (최근 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 CenterFile Exchange에서 MATLAB에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by