Я бы хотел найти векторизованный способ для вычисления совокупных сумм вектора, но с верхним и нижним пределом.cumsum с верхним и нижним пределами?
В моем случае вход содержит только 1 и -1. Вы можете использовать это предположение в своем ответе. Конечно, более общее решение также приветствуется.
Например:
x = [1 1 1 1 -1 -1 -1 -1 -1 -1];
upper = 3;
lower = 0;
s = cumsum(x) %// Ordinary cumsum.
s =
1 2 3 4 3 2 1 0 -1 -2
y = cumsumlim(x, upper, lower) %// Cumsum with limits.
y =
1 2 3 3 2 1 0 0 0 0
^ ^
| |
upper limit lower limit
Когда накопленная сумма достигает верхнего предела (на 3-й элемент), он не будет больше расти. Аналогично, когда суммарная сумма достигает нижнего предела (на 7-м элементе), она больше не будет уменьшаться. Версия для петли будет такой:
function y = cumsumlim(x, upper, lower)
y = zeros(size(x));
y(1) = x(1);
for i = 2 : numel(x)
y(i) = y(i-1) + x(i);
y(i) = min(y(i), upper);
y(i) = max(y(i), lower);
end
end
У вас есть идеи?
Я не совсем понимаю пример вывода вы показали. Можете ли вы быть более подробными и объяснить, как вы достигли желаемого результата? Как именно верхний и нижний пределы вступают в игру с вашей функцией «cumsum»? – rayryeng
Есть ли '' '' '' '' '' и '-1''? – Divakar
@BenW либо укажет ограничения на то, что 'x' может содержать, либо выбрать более представительный' x'. Во-первых, если он превысит «1» выше и/или ниже пределов, допустите ли он один и тот же предел более одного раза и, самое главное, как упоминает Дивакар, если «х» может содержать другие номера, пожалуйста, включите некоторые – Dan