2

这与: 在序列中查找零岛有关

但是,问题并不完全相同:

让我们取与上述帖子相同的向量进行比较:

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

我想知道是否有人对上述问题有更快的矢量化解决方案。

4

3 回答 3

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
于 2013-03-17T18:40:30.767 回答
0

使用来自同一个链接问题的 gnovice 的答案。它是矢量化的,并且运行在duration == n您想要的位置。

https://stackoverflow.com/a/3274416/105904

以 运行duration >= n,然后除以durationn这将告诉您在每个位置有多少连续运行以及如何扩展索引列表。如果您的岛密度不是太高,这最终可能比正则表达式版本更快。

于 2013-03-18T02:41:56.420 回答
0

做这个:

例如,让我们看一下您想要的运行长度为 2 的情况。

  1. 将向量转换为二进制数
  2. 设置索引 = size-1,设置起始 = []
  3. 循环直到 n < 4:
  4. n能被4整除吗?
  5. 是的?将索引附加到开始。设置 n = n / 4
  6. 不?设置 n = n / 2
  7. 转到 3

对于任何其他运行长度,将 4 替换为 2**运行。

于 2013-03-17T10:47:32.767 回答