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

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?

답변 (6개)

Roger Stafford
Roger Stafford 2014년 1월 29일
편집: Roger Stafford 2014년 1월 29일
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 2014년 1월 29일
편집: Azzi Abdelmalek 2014년 1월 29일
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

I got an error when I tried this:
Error using strrep Input strings must have one row.
Error in accelfilter (line 636) b=strrep(num2str(a),' ','');
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)
If M is a column array, just add at the beginning of your code
M=M'

댓글을 달려면 로그인하십시오.

Azzi Abdelmalek
Azzi Abdelmalek 2014년 1월 29일
편집: Azzi Abdelmalek 2014년 1월 29일
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

suppose that the array M length could change? How can I make the code still work for a matrix of size (1,n)?
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
Okay ,yes that works. Thank you very much.

댓글을 달려면 로그인하십시오.

José-Luis
José-Luis 2014년 1월 29일
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 2014년 1월 29일
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) 2014년 1월 29일
편집: Jos (10584) 2014년 1월 29일
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+')

카테고리

도움말 센터File Exchange에서 Logical에 대해 자세히 알아보기

질문:

2014년 1월 29일

댓글:

2014년 1월 29일

Community Treasure Hunt

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

Start Hunting!

Translated by