Ich möchte einen vektorisierten Weg finden, um die kumulativen Summen eines Vektors zu berechnen, aber mit oberen und unteren Grenzen.cumsum mit oberen und unteren Grenzen?
In meinem Fall enthält die Eingabe nur 1 und -1. Sie können diese Annahme in Ihrer Antwort verwenden. Natürlich ist auch eine allgemeinere Lösung willkommen.
Zum Beispiel:
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
Wenn die kumulative Summe der oberen Grenze (am dritten Element) erreicht hat, wird es nicht mehr erhöhen. Ebenso, wenn die kumulative Summe die untere Grenze erreicht (am 7. Element), wird sie nicht mehr abnehmen. Eine For-Loop-Version wäre wie folgt:
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
Haben Sie irgendwelche Ideen?
Ich verstehe nicht ganz, das Beispiel Ausgabe, die Sie gezeigt haben. Kannst du ausführlicher sein und erklären, wie du zu deinem gewünschten Output gekommen bist? Wie genau spielen die oberen und unteren Grenzen mit deiner "Cumsum" -Funktion zusammen? – rayryeng
Enthält 'x' nur' 1's und -1's? – Divakar
@BenW entweder Grenzen angeben, was 'x' enthalten kann, oder wählen Sie ein repräsentativeres' x'. Erstens muss es mehr als "1" über und/oder unter die Grenzen gehen, es muss mehr als einmal die gleiche Grenze überschreiten und am wichtigsten, wie Divakar erwähnt, wenn "x" andere Zahlen enthalten kann, bitte einige – Dan