Использование diff
- это быстрый способ сделать это.
Вот демонстрационная версия (подробности см. В комментариях):
% Junk data for demo. Indices shown above for reference
% 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
x = [0, 0, 0, 2, 3, 4, 0, 0, 1, 1, 7, 9, 3, 4, 0, 0, 0];
% Logical converts all non-zero values to 1
% diff is x(2:end)-x(1:end-1), so picks up on changes to/from zeros
% Instead of 'logical', you could have a condition here,
% e.g. bChange = diff( x > 0.5 );
bChange = diff( logical( x ) );
% bChange is one of the following for each consecutive pair:
% 1 for [0 1] pairs
% 0 for [0 0] or [1 1] pairs
% -1 for [1 0] pairs
% We inflate startIdx by 1 to index the non-zero value
startIdx = find( bChange > 0 ) + 1; % Indices of [0 1] pairs
endIdx = find( bChange < 0 ); % Indices of [1 0] pairs
Я оставлю это в качестве упражнения, чтобы охватить крайние случаи, когда вы добавляете начальный или конечный индекс, еслимассив начинается или заканчивается ненулевым значением.Подсказка: вы можете обрабатывать каждый случай отдельно или дополнять начальные значения x
дополнительными конечными значениями.
Вывод вышеуказанного:
startIdx
>> [4, 9]
endIdx
>> [6, 14]
Таким образом, вы можете отформатировать это так, как вам нравитсяпролет 4-6, 9-14
.