Find indices where runs of zeros and ones ends

3 Ansichten (letzte 30 Tage)
Awais Saeed
Awais Saeed am 3 Aug. 2021
Bearbeitet: Stephen23 am 4 Aug. 2021
Assuming that I have a vector
H = [0 0 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0];
I want to know the indices where long runs of 1's and 0's ends. Let's say if a bit repeats 4 times or greater, then it is a run of length greater than 4. According to this, I want to know the indices where all runs ends. First run is of zeros which ends at index 4. Second run is of ones which ends at 8. Third run is of zeros again and it ends at 17.
So far, I am able to count the run length only as following
i = find(diff(H));
run_length = [i numel(H)] - [0 i];
run_length =
4 4 1 1 1 1 5
However, the needed answer is [4 8 17]. cumsum would not work because it will give cummulative sum of whole vector as
cumsum(run_length)
ans =
4 8 9 10 11 12 17
Any suggestions will be helpful.

Akzeptierte Antwort

Jonas
Jonas am 3 Aug. 2021

i would use

H = [0 0 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0];
Hstr=erase(num2str(H),' ');
[~,onesEnds]=regexp(Hstr,{'0000+','1111+'});
sort(cell2mat(onesEnds))
  4 Kommentare
Awais Saeed
Awais Saeed am 4 Aug. 2021
Yes, this one is more flexible. Thank you.
Stephen23
Stephen23 am 4 Aug. 2021
Bearbeitet: Stephen23 am 4 Aug. 2021
Simpler and more efficient:
H = [0,0,0,0,1,1,1,1,0,1,0,1,0,0,0,0,0];
S = sprintf('%u',H);
X = regexp(S,'(0{4,}|1{4,})','end') % only zeros and ones
X = 1×3
4 8 17
X = regexp(S,'(.)(??$1{3,})','end') % any character
X = 1×3
4 8 17

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Creating and Concatenating Matrices 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!

Translated by