Как эффективно найти максимум выбранных индексов массива в matlab?

Допустим, у нас есть векторы: w, s_on и s_off. s_on и s_off имеют возрастающие индексы начала и смещения события. Нам нужно найти максимальное значение во время каждого события. Как мы можем это сделать без использования цикла. например, у нас могут быть следующие значения:

s_on = [5 19 78 101];
s_off = [10 28 97 152];
w = rand(1,200);

Следующий код не работает:

pv = max(w(s_on(1:end):s_off(1:end)))
1
0
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пусть данные определены как

s_on = [5 19 78 101];
s_off = [10 28 97 152];
w = rand(1,200);

Максимум для каждого диапазона индексов можно вычислить следующим образом:

[v, t] = max(bsxfun(@ge, 1:numel(w), s_on(:)) & bsxfun(@le, 1:numel(w), s_off(:)), [], 1);
result = accumarray(t(v).', w(v).', [], @max);

Цикл был бы более читабельным:

result_loop = NaN(numel(s_on), 1);
for k = 1:numel(s_on)
    result_loop(k) = max(w(s_on(k):s_off(k)));
end

Убедитесь, что оба подхода дают одинаковый результат:

isequal(result, result_loop)

Другие вопросы по теме