Find indices where runs of zeros and ones ends

3 visualizzazioni (ultimi 30 giorni)
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.

Risposta accettata

Jonas
Jonas il 3 Ago 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 Commenti
Awais Saeed
Awais Saeed il 4 Ago 2021
Yes, this one is more flexible. Thank you.
Stephen23
Stephen23 il 4 Ago 2021
Modificato: Stephen23 il 4 Ago 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

Accedi per commentare.

Più risposte (0)

Community Treasure Hunt

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

Start Hunting!

Translated by