Представьте, что у вас очень длинная последовательность. Какой самый эффективный способ найти интервалы, в которых последовательность - это все нули (или, точнее, последовательность падает до почти нулевых значений 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'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);
Я хочу векторизовать / оптимизировать код, но я открыт для других решений.
Я должен подчеркнуть, что эффективность пространства и времени очень важна, так как я обрабатываю большое количество длинных биосигналов.