Finding Consecutive True Values in a Vector
10 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Jason Nicholson
am 4 Feb. 2014
Bearbeitet: Azzi Abdelmalek
am 7 Feb. 2014
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
0 Kommentare
Akzeptierte Antwort
Andrei Bobrov
am 5 Feb. 2014
Bearbeitet: Andrei Bobrov
am 5 Feb. 2014
a0 = a(:); % input vector
ii = strfind(a0',[1 0]);
a1 = cumsum(a0);
i1 = a1(ii);
a0(ii+1) = -[i1(1);diff(i1)];
out = cumsum(a0); % output vector
3 Kommentare
Weitere Antworten (3)
Roger Stafford
am 5 Feb. 2014
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
am 4 Feb. 2014
Bearbeitet: Azzi Abdelmalek
am 4 Feb. 2014
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 Kommentare
Image Analyst
am 5 Feb. 2014
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.
Jos (10584)
am 7 Feb. 2014
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:
0 Kommentare
Siehe auch
Kategorien
Mehr zu Annotations finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!