这与以下内容有关: Finding islands of zeros in a sequence
然而,问题并不完全相同:
为了比较,我们用上面的帖子取相同的向量:
sig = [1 1 0 0 0 0 1 1 1 1 1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 0];
我想要找到的是 n 连续零的岛的起始索引;但是,不允许重叠。例如,对于n = 2,我想要结果: v = [3,5,14,25];
我发现Amro辉煌的解决方案作为一个起点(特别是关于strfind),但他的答案的第二部分并没有给我我期望的结果。到目前为止,这是一个非矢量化的解决方案:
function v=findIslands(sig, n)
% Finds indices of unique islands
% sig --> target vector
% n --> This is the length of the island
% This will find the starting indices for all "islands" of ones
% but it marks long strings multiple times
startIndex = strfind(sig, zeros(1,n));
L=length(startIndex);
% ongoing gap counter
spc=0;
if L>0 % Check if empty
v=startIndex(1);
for i=2:L
% Count the distance
spc=spc+(startIndex(i)-startIndex(i-1));
if spc>=n
v=[v,startIndex(i)];
% Reset odometer
spc=0;
end
end
else
v=[];
display('No Islands Found!')
end
我想知道是否有人对上述问题有更快的矢量化解决方案。
答案 0 :(得分:2)
您可以将所有内容转换为字符串并使用正则表达式:
regexp(sprintf('%d', sig(:)), sprintf('%d', zeros(n, 1)))
>> sig = [1 1 0 0 0 0 1 1 1 1 1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 0];
>> n = 2;
>> regexp(sprintf('%d', sig(:)), sprintf('%d', zeros(n, 1)))
ans =
3 5 14 25
答案 1 :(得分:0)
这样做:
作为一个例子,让我们看一下你想要的游程长度为2的情况。
对于任何其他运行长度,用2 **运行替换4。
答案 2 :(得分:0)
使用相同链接问题的gnovice答案。它是矢量化的,并且运行duration == n
就是你想要的那些。
https://stackoverflow.com/a/3274416/105904
使用duration >= n
进行运行,然后将duration
除以n
,这将告诉您每个位置连续运行的次数以及如何扩展索引列表。如果您的岛密度不是太高,这可能会比正则表达式更快。</ p>