Find indices where runs of zeros and ones ends

4 次查看(过去 30 天)
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.

采纳的回答

Jonas
Jonas 2021-8-3

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 个评论
Stephen23
Stephen23 2021-8-4
编辑:Stephen23 2021-8-4
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

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Logical 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by