Finding Consecutive True Values in a Vector
이전 댓글 표시
I want to sum consecutive 1 values given a logical input vector. An example of input and output is below. Notice that the output is the sum of the previous elements that were 1 and if a zero element is encountered, the sum starts over. I am trying to avoid a for loop here if I can. Suggestions?
Input Output
0 0
0 0
0 0
1 1
0 0
1 1
0 0
0 0
1 1
1 2
1 3
1 4
0 0
1 1
0 0
1 1
1 2
0 0
채택된 답변
추가 답변 (3개)
Roger Stafford
2014년 2월 5일
Let the input column vector be called x.
y = [x;0];
f = find(diff([0;y])~=0);
p = f(2:2:end);
y(p) = y(p)-p+f(1:2:end-1);
y = cumsum(y(1:end-1));
Then y is your output.
Azzi Abdelmalek
2014년 2월 4일
편집: Azzi Abdelmalek
2014년 2월 4일
a=[0 0 0 1 0 1 0 0 1 1 1 1 0]'
ii1=strfind([0 a' 0],[0 1])
ii2=strfind([0 a' 0],[1 0])-1
out=zeros(1,numel(a));
for k=1:numel(ii1)
c1=ii1(k);
c2=ii2(k);
out(c1:c2)=1:c2-c1+1
end
out'
댓글 수: 3
Jason Nicholson
2014년 2월 4일
편집: Jason Nicholson
2014년 2월 5일
Image Analyst
2014년 2월 5일
Don't be afraid of for loops. The fear of them is way overblown, especially for more recent versions of MATLAB. Unless your vector is tens of millions of elements long, I wouldn't worry about it. I would choose the one answer from the 3 that is the most well commented, intuitive, and easy to understand , if there is any. Any speed differences are probably negligible.
Jason Nicholson
2014년 2월 7일
Jos (10584)
2014년 2월 7일
Hide the loops ;-)
input = [1 0 1 1 0 0 1 1 1 0 1 0 1 1 1 1 0]
[~,~,C] = logicalfind(input,1) ;
C = cellfun(@cumsum, C,'un',0) ;
output = input ;
output(output==1) = [C{:}]
LOGICALFIND can be downloaded here:
카테고리
도움말 센터 및 File Exchange에서 Annotations에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!