Вот мое предложение для решения этой проблемы:
StartIdx = 3;
EndIdx = 4;
Idx = [2 19 23];
old_sig = [-2 0 1 2 5 6 7 8 10 19 20 21 22 23 24 25 26 27 28 29];
% Get number of "indices".
nIdx = numel(Idx);
% Find actual indices.
idx = ceil(find(repmat(old_sig, nIdx, 1) == repmat(Idx', 1, numel(old_sig))) / nIdx);
% Set up correct (index) ranges to access in old_sig.
idx = repmat(-StartIdx:EndIdx, nIdx, 1) + repmat(idx, 1, (StartIdx + EndIdx + 1));
% Determine output.
new_sig = old_sig(idx)
В качестве вывода получаем:
new_sig =
-2 0 1 2 5 6 7 8
7 8 10 19 20 21 22 23
20 21 22 23 24 25 26 27
Предостережение: на данный момент ваш old_sig
содержит уникальные значения. Следовательно, find
найдет правильный (уникальный) индекс. Если значения в вашем сигнале повторяются, необходимо указать, какое значение должно быть найдено.
Еще одна оговорка: в зависимости от того, насколько велик ваш сигнал old_sig
и сколько у вас индексов в Idx
, этот подход может потребовать большого объема памяти.