我有
x=[ 1 1 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 1 0 1]
我想找到连续超过5个零的所有区域。我想找到它开始的位置和停止的位置。
在这种情况下,我想要这个:c=[12 18]
。我可以使用for循环来做,但我想知道是否有更好的方法,至少要找出是否有一些区域出现这个'掩码'(mask=[0 0 0 0 0]
)。
答案 0 :(得分:2)
基于卷积的方法:
n = 5;
x = [0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 1 0];
end_idx = find(diff(conv(~x, ones(1,n))==n)==-1)
start_idx = find(diff(conv(~x, ones(1,n))==n)==1) - n + 2
返回
end_idx =
6 14 25
start_idx =
1 9 20
请注意,此部分对于两行都是通用的:diff(conv(~x, ones(1,n))==n)
因此将它拉出来会更有效:
kernel = ones(1,n);
convolved = diff(conv(~x, kernel)==n);
end_idx = find(convolved==-1)
start_idx = find(convolved==1) - n + 2
答案 1 :(得分:1)
您可以这样使用regexp
:
0
可能的实施可能是:
x=[ 1 1 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 1 0 1]
% Convert the array to string and remove the blanks
str=strrep(num2str(x),' ','')
% Find the occurrences
[start_idx,end_idx]=regexp(str,'0{6,}')
这给出了:
start_idx = 12
end_idx = 17
其中x(start_idx)
是序列的第一个元素,x(end_idx)
是最后一个元素
应用于更长的序列,start_idx
和end_idx
结果为数组:
x=[0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 1 0]
start_idx =
1 9 20
end_idx =
6 14 25