Efficient method to detect nonzero value trains up to a certain lenght?

Illustration
Benjamin - 2021-01-05T12:31:36+00:00
Question: Efficient method to detect nonzero value trains up to a certain lenght?

I have data as follows (either numerical or logical, it doesn't matter in this case):     [0 1 0 1 1 0 1 1 1 0 1 1 1 1 0] Every 0 represents one or more zeroes. I want to detect where consecutive sequences of ones are, but no longer than three after one another. I can do this imperatively with some for- or while-loop, walking over a window of five (?) elements, but I think that's computationally ineffective. How can I do this without loops, but with something like conv or movmean? The expected (logical) result for trains of nonzero values up to three long is [0 1 0 1 1 0 1 1 1 0 0 0 0 0 0] I know I can detect  single peaks with: function tf = findsinglenonzeros(x) c = conv(double(x), [1, 1, 1], 'same'); tf = c & x == c; end But now for of nonzero values up to three (or n) long.

Expert Answer

Profile picture of Kshitij Singh Kshitij Singh answered . 2025-11-20

  n=3;
  P=find(~[0 x(:).' 0]);
  d=diff(P)-1;
  idx=(d>=1)&(d<=n);
  
  locations=P( idx  );
  lengths=d(idx);
  
  z=zeros(1,numel(x)+1);
  z(locations)=1;
  z(locations+lengths)=-1;
  
  result =cumsum(z(1:end-1)),


Not satisfied with the answer ?? ASK NOW

Get a Free Consultation or a Sample Assignment Review!