想象一下你有一个很长的序列。找到序列全为零的区间的最有效方法是什么(或更准确地说,序列下降到接近零的值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 Duration
3 6 4
12 12 1
14 16 3
25 26 2
30 30 1
然后使用此信息,我们找到持续时间 >= 到某个指定值(例如3
)的区间,并返回所有这些区间中的值的索引组合:
indices = [3 4 5 6 14 15 16];
最后一部分与上一个问题有关:
这是我到目前为止所拥有的:
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);
我正在寻找矢量化/优化代码,但我对其他解决方案持开放态度。我必须强调空间和时间效率非常重要,因为我正在处理大量的长生物信号。