Find at least 4 consecutive values less than 1 in an array
2 次查看(过去 30 天)
显示 更早的评论
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
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
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 个评论
Azzi Abdelmalek
2014-1-29
编辑:Azzi Abdelmalek
2014-1-29
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
2014-1-29
If M is a column array, just add at the beginning of your code
M=M'
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 个评论
Azzi Abdelmalek
2014-1-29
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
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))
0 个评论
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);
0 个评论
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+')
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Structures 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!