MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   在序列中寻找零岛 (https://www.labfans.com/bbs/showthread.php?t=23707)

poster 2019-12-10 20:48

在序列中寻找零岛
 
假设您的序列很长。查找序列全为零的时间间隔(或更准确地说,序列下降到接近零的值abs(X) =的间隔达到某个指定值(例如3 ),并在所有这些间隔组合中返回值的索引:

indices = [3 4 5 6 14 15 16]; 最后一部分与上一个问题有关:
[INDENT] [URL="https://stackoverflow.com/questions/2807270/matlab-vectorized-array-creation-from-a-list-of-start-end-indices"]MATLAB:从开始/结束索引列表创建向量化数组[/URL]

[/INDENT]这是我到目前为止的内容:

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); 我正在寻求矢量化/优化代码,但是我对其他解决方案持开放态度。我必须强调空间和时间效率非常重要,因为我正在处理大量的长生物信号。



[B]回答:[/B]

从给定的vector sig开始,我将按照以下这些步骤以向量化的方式解决您的问题:
[LIST][*]首先,对向量进行阈值处理以获得零和一的向量tsig (信号绝对值下降到接近零的零,其他地方为零):

tsig = (abs(sig) >= eps); %# Using eps as the threshold[*]接下来,使用函数[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/diff.html"]DIFF[/URL]和[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/find.html"]FIND查找[/URL]每个零字符串的开始索引,结束索引和持续时间:

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);[*]最后,使用[URL="https://stackoverflow.com/questions/2807270/matlab-vectorized-array-creation-from-a-list-of-start-end-indices/2807994#2807994"]我对所链接问题的答案中的方法[/URL]来生成最终的索引集:

indices = zeros(1,max(endIndex)+1); indices(startIndex) = 1; indices(endIndex+1) = indices(endIndex+1)-1; indices = find(cumsum(indices));[/LIST]
[url=https://stackoverflow.com/questions/3274043]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 01:07

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.