Mi piacerebbe trovare un modo vettoriale per calcolare le somme cumulative di un vettore, ma con i limiti superiore e inferiore.cumsum con limiti superiore e inferiore?
Nel mio caso, l'input contiene solo 1 e -1. Puoi usare questa ipotesi nella tua risposta. Naturalmente, una soluzione più generale è anche benvenuta.
Ad esempio:
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
Quando la somma cumulativa raggiunge il limite superiore (al 3 ° elemento), non aumenterà più. Allo stesso modo, quando la somma cumulativa raggiunge il limite inferiore (al settimo elemento), non diminuirà più. Una versione for-loop sarebbe così:
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
Avete qualche idea?
io non capisco l'uscita esempio che avete mostrato. Puoi essere più dettagliato e spiegare come sei arrivato all'output desiderato? In che modo esattamente i limiti superiore e inferiore entrano in gioco con la funzione "cumsum'"? – rayryeng
'x' contiene solo" 1's "e" -1's "? – Divakar
@BenW o specifica i limiti su cosa 'x' può contenere o scegliere un' x' più rappresentativo. In primo luogo, devi andare oltre "1" sopra e/o sotto i limiti, avere lo stesso limite più di una volta e, cosa più importante come dice Divakar, se 'x' può contenere altri numeri per favore includi alcuni – Dan