在序列中查找零岛想象一下你有一个很长的序列。找出序列全部为零的区间(或者更准确地说,序列降到近零值)的最有效的方法是什么?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));
芜湖不芜
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;
添加回答
举报
0/150
提交
取消