在matlab数组中找到非重叠的零序列

时间:2013-03-17 10:41:13

标签: matlab vectorization

这与以下内容有关: 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

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

3 个答案:

答案 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的情况。

  1. 将向量转换为二进制数
  2. 设置index = size-1,设置起始= []
  3. 循环直到n < 4:
  4. 可以被4整除吗?
  5. 是?将索引附加到开始。设置n = n / 4
  6. 否?设置n = n / 2
  7. 转到3
  8. 对于任何其他运行长度,用2 **运行替换4。

答案 2 :(得分:0)

使用相同链接问题的gnovice答案。它是矢量化的,并且运行duration == n就是你想要的那些。

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

使用duration >= n进行运行,然后将duration除以n,这将告诉您每个位置连续运行的次数以及如何扩展索引列表。如果您的岛密度不是太高,这可能会比正则表达式更快。<​​/ p>