为了账号安全,请及时绑定邮箱和手机立即绑定

在序列中查找零岛

在序列中查找零岛

在序列中查找零岛想象一下你有一个很长的序列。找出序列全部为零的区间(或者更准确地说,序列降到近零值)的最有效的方法是什么?abs(X)<eps):为了简单起见,让我们假设以下顺序: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];我试图获得以下信息:startIndex   EndIndex    Duration3            6           412           12          114           16          325           26          230           30          1然后使用这些信息,我们发现持续时间>=的时间间隔为某些指定的值(例如3),并返回所有这些区间中的值的索引组合:indices = [3 4 5 6 14 15 16];最后一部分与前一个问题有关:MATLAB:从开始/结束索引列表中创建向量化数组到目前为止,这就是我所拥有的: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 intervalv = 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 intervalsfor i=1:thresh-1    v(find(v)+1) = true;end%# get the final indicesv = find(v);我希望对代码进行矢量化/优化,但我对其他解决方案持开放态度。我必须强调,空间和时间效率是非常重要的,因为我正在处理大量的长生物信号。
查看完整描述

3 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

以下是我将采取的步骤,以矢量化的方式解决您的问题,从给定的向量开始。sig:

  • 首先,对向量进行阈值化,得到一个向量。tsig指零和一(信号绝对值降到接近于零的零点,其他地方的零点):

    tsig = (abs(sig) >= eps);  %# Using eps as the threshold
  • 接下来,使用函数查找每个零字符串的起始索引、结束索引和持续时间。差夫找到,发现:

    dsig = diff([1 tsig 1]);startIndex = find(dsig < 0);endIndex = find(dsig > 0)-1;duration = endIndex-startIndex+1;
  • 然后,查找持续时间大于或等于某个值的零字符串(如示例中的3):

    stringIndex = (duration >= 3);startIndex = startIndex(stringIndex);endIndex = endIndex(stringIndex);
  • 最后,使用从我对链接问题的回答中找出的方法若要生成最后一组索引,请执行以下操作:

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


查看完整回答
反对 回复 2019-07-09
?
慕斯709654

TA贡献1840条经验 获得超5个赞

您可以通过查找长度为零的字符串,将其作为字符串搜索任务来解决。thresh(STRFIND函数非常快)

startIndex = strfind(sig, zeros(1,thresh));

请注意,较长的子字符串将在多个位置被标记,但当我们从间隔开始添加中间位置时,最终将连接到一起。startIndex到此为止start+thresh-1.

indices = unique( bsxfun(@plus, startIndex', 0:thresh-1) )';

请注意,您始终可以将最后一步与CUMSUM/Find解决方案从关联问题.


查看完整回答
反对 回复 2019-07-09
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

function indice=sigvec(sig,thresh)
    %extend sig head and tail to avoid 0 head and 0 tail

    exsig=[1,sig,1];
    %convolution sig with extend sig
    cvexsig=conv(exsig,ones(1,thresh));
    tempsig=double(cvexsig==0);

    indice=find(conv(tempsig,ones(1,thresh)))-thresh;


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 483 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信