Представьте, что у вас очень длинная последовательность. Что является наиболее эффективным способом нахождения интервалов, где последовательность все нули (или точнее последовательность падает до почти нулевых значений 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];
Это последняя часть связана с предыдущим вопросом:
MATLAB: vectorized array creation from a list of start/end indices
Это то, что я до сих пор:
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);
Я ищу для векторизации/оптимизации кода, но я открыт для других решений дополнения. Я должен подчеркнуть, что эффективность пространства и времени очень важна, поскольку я обрабатываю большое количество длинных биосигналов.
Мне нравится использование вами островов. – ChaosPandion
@ChaosPandion: поиск островов нулей в море из них .. arrr :) – merv