在序列中寻找零岛 [英] Finding islands of zeros in a sequence

查看:66
本文介绍了在序列中寻找零岛的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

想象一下,您的序列很长.查找序列全为零的时间间隔(或更准确地说,序列降至接近零值abs(X)<eps)的最有效方法是:

Imagine you have a very long sequence. What is the most efficient way of finding the intervals where the sequence is all zeros (or more precisely the sequence drops to near-zero values abs(X)<eps):

为简单起见,让我们假设以下顺序:

For simplicity, lets assume the following 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];

我正在尝试获取以下信息:

I'm trying to get the following information:

startIndex   EndIndex    Duration
3            6           4
12           12          1
14           16          3
25           26          2
30           30          1

然后使用此信息,找到持续时间> =的间隔为某个指定值(例如3),并返回所有这些间隔组合中的值的索引:

then using this information, we find the intervals with duration >= to some specified value (say 3), and returning the indices of the values in all these intervals combined:

indices = [3 4 5 6 14 15 16];

最后一部分与上一个问题有关

That last part is related to a previous question:

MATLAB:向量化数组的创建 从开始/结束索引列表中

MATLAB: vectorized array creation from a list of start/end indices

这是我到目前为止所拥有的:

This is what I have so far:

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];
len = length(sig);
thresh = 3;

%# align the signal with itself successively shifted by one
%# v will thus contain 1 in the starting locations of the zero interval
v = true(1,len-thresh+1);
for i=1:thresh
    v = v & ( sig(i:len-thresh+i) == 0 );
end

%# extend the 1's till the end of the intervals
for i=1:thresh-1
    v(find(v)+1) = true;
end

%# get the final indices
v = find(v);

我正在寻求矢量化/优化代码,但是我愿意接受其他解决方案. 我必须强调空间和时间效率非常重要,因为我正在处理大量的长生物信号.

I'm looking to vectorize/optimize the code, but I'm open to other solutions. I have to stress that space and time efficiencies are very important, since I'm processing a large number of long bio-signals.

推荐答案

这些是我将以矢量化的方式解决您的问题的步骤,从给定的矢量sig开始:

These are the steps I would take to solve your problem in a vectorized way, starting with a given vector sig:

  • 首先,对向量进行阈值处理以得到零和一的向量tsig(零的信号绝对值下降到接近零的零,其他地方则为零):

  • First, threshold the vector to get a vector tsig of zeros and ones (zeroes where the absolute value of the signal drops close enough to zero, ones elsewhere):

tsig = (abs(sig) >= eps);  %# Using eps as the threshold

  • 接下来,使用函数

  • 然后,找到持续时间大于或等于某个值(例如您的示例中为3)的零字符串:

  • Then, find the strings of zeroes with a duration greater than or equal to some value (such as 3, from your example):

    stringIndex = (duration >= 3);
    startIndex = startIndex(stringIndex);
    endIndex = endIndex(stringIndex);
    

  • 最后,使用

  • Finally, use the method from my answer to the linked question to generate your final set of indices:

    indices = zeros(1,max(endIndex)+1);
    indices(startIndex) = 1;
    indices(endIndex+1) = indices(endIndex+1)-1;
    indices = find(cumsum(indices));
    

  • 这篇关于在序列中寻找零岛的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆