Find at least 4 consecutive values less than 1 in an array
1 回表示 (過去 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 で Logical についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!