在二进制数组中查找连续零的区域

时间:2018-04-17 15:12:36

标签: arrays matlab vector

我有

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])。

2 个答案:

答案 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

  • 将数组转换为字符串
  • 删除空白
  • 使用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_idxend_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