Find at least 4 consecutive values less than 1 in an array

1 view (last 30 days)
I have an array in which I need to find four or more consecutive values that are less than one. For example: M = [1 0 .3 .5 .2 .1 6 7 .3 .5 10 1 .8 .9 .7 .2 .1 .3]
The program should return the indexes 3-6 and 13-18.
How can I go about solving this?

Answers (6)

Roger Stafford
Roger Stafford on 29 Jan 2014
Edited: Roger Stafford on 29 Jan 2014
Here's another one-liner if you accept initial indices as an answer.
f = find(all(hankel(M(1:4),M(4:end))<1,2));

Azzi Abdelmalek
Azzi Abdelmalek on 29 Jan 2014
Edited: Azzi Abdelmalek on 29 Jan 2014
Edit
M= [1 0 .3 .5 .2 .1 6 7 .3 .5 10 1 .8 .9 .7 .2 .1 .3]
if diff(size(M))<0
M=M'
end
a=M<1;
b=strrep(num2str(a),' ','');
[ii,jj]=regexp(b,'1+','start','end')
d=jj-ii>=4
out=[ii;jj];
out=out(:,d)
  3 Comments
Azzi Abdelmalek
Azzi Abdelmalek on 29 Jan 2014
Edited: Azzi Abdelmalek on 29 Jan 2014
If you copy and paste the code, there is no error, unless you are using M that is not a 1xn array. What is the size of M
size(M)

Sign in to comment.


Azzi Abdelmalek
Azzi Abdelmalek on 29 Jan 2014
Edited: Azzi Abdelmalek on 29 Jan 2014
Edit
M= [1 0 .3 .5 .2 .1 6 7 .3 .5 10 1 .8 .9 .7 .2 .1 .3];
if diff(size(M))<0
M=M'
end
a=[0 M<1 0];
ii=strfind(a,[0 1]);
jj=strfind(a,[1 0])-1;
d=jj-ii>=4;
out=[ii;jj];
out=out(:,d)
  3 Comments
Azzi Abdelmalek
Azzi Abdelmalek on 29 Jan 2014
It doesn't matter if the length changes. Maybe you are asking if the size changes, from 1xn to nx1. In this case we can edit our code. Look at edited answesrs

Sign in to comment.


José-Luis
José-Luis on 29 Jan 2014
M = [1 0 .3 .5 .2 .1 6 7 .3 .5 10 1 .8 .9 .7 .2 .1 .3];
numVal = 4;
your_vals = conv(double(M<1),ones(1,numVal)/numVal,'valid') == 1;
start = find(diff([0 your_vals]) == 1)
finish = fliplr(numel(M) + 1 - find(diff([0 fliplr(your_vals)]) == 1))

Andrei Bobrov
Andrei Bobrov on 29 Jan 2014
t = M<1&M>0;
t1 = [true;diff(t(:))~=0];
idx=accumarray(cumsum(t1),(1:numel(M))',[],@(x){x});
ii = idx(t(t1));
out = ii(cellfun(@numel,ii)>=4);

Jos (10584)
Jos (10584) on 29 Jan 2014
Edited: Jos (10584) on 29 Jan 2014
Here is a relatively simple one-liner:
M = [1 0 .3 .5 .2 .1 6 7 .3 .5 10 1 .8 .9 .7 .2 .1 .3] % example data
[startIDX, endIDX] = regexp(char((M(:).'< 1)+'0'), '1111+')

Categories

Find more on Structures in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!