如何在MATLAB中有效地找到数组中所选索引的最大值?

时间:2018-04-11 09:36:12

标签: matlab vectorization

我们说我们有矢量:ws_ons_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 :(得分: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)