Представьте, что у вас очень длинная последовательность. Каков наиболее эффективный способ нахождения интервалов, где последовательность - все нули (точнее, последовательность падает до почти нулевых значений 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: создание векторизованного массива из списка начальных/конечных индексов
Это то, что у меня есть до сих пор:
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 till the end of the intervals
for i=1:thresh-1
v(find(v)+1) = true;
end
%# get the final indices
v = find(v);
Я ищу для векторизации/оптимизации кода, но я открыт для других решений. Я должен подчеркнуть, что эффективность пространства и времени очень важна, поскольку я обрабатываю большое количество длинных биосигналов.