Find at least 4 consecutive values less than 1 in an array
Mostrar comentarios más antiguos
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?
1 comentario
José-Luis
el 29 de En. de 2014
That would be 2-6 and 13-18
Respuestas (6)
Roger Stafford
el 29 de En. de 2014
Editada: Roger Stafford
el 29 de En. de 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));
1 comentario
Jos (10584)
el 29 de En. de 2014
+1
Azzi Abdelmalek
el 29 de En. de 2014
Editada: Azzi Abdelmalek
el 29 de En. de 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 comentarios
Neha
el 29 de En. de 2014
Azzi Abdelmalek
el 29 de En. de 2014
Editada: Azzi Abdelmalek
el 29 de En. de 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)
Azzi Abdelmalek
el 29 de En. de 2014
If M is a column array, just add at the beginning of your code
M=M'
Azzi Abdelmalek
el 29 de En. de 2014
Editada: Azzi Abdelmalek
el 29 de En. de 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 comentarios
Neha
el 29 de En. de 2014
Azzi Abdelmalek
el 29 de En. de 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
Neha
el 29 de En. de 2014
José-Luis
el 29 de En. de 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
el 29 de En. de 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)
el 29 de En. de 2014
Editada: Jos (10584)
el 29 de En. de 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+')
Categorías
Más información sobre Loops and Conditional Statements en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!