cumsum mit oberen und unteren Grenzen?

8

Ich möchte einen vektorisierten Weg finden, um die kumulativen Summen eines Vektors zu berechnen, aber 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:

%Vor%

Wenn die kumulative Summe die Obergrenze (am 3. Element) erreicht, wird sie nicht mehr erhöht. 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:

%Vor%

Haben Sie irgendwelche Ideen?

    
Ben.W 06.08.2015, 06:31
quelle

2 Antworten

5

Dies ist eine etwas hackische Lösung, aber vielleicht erwähnenswert.

Sie können die Summe mit einem signed integer-Datentyp erstellen und die inhärenten Grenzen dieses Datentyps ausnutzen. Damit dies funktioniert, muss die Eingabe in diesen Integer-Typ konvertiert und mit dem entsprechenden Faktor multipliziert werden, und ein erster Offset muss angewendet werden. Der Faktor und der Offset werden als Funktion von lower und upper ausgewählt. Nach cumsum werden Multiplikation und Offset rückgängig gemacht, um das gewünschte Ergebnis zu erhalten.

In Ihrem Beispiel ist der Datentyp int8 ausreichend; und der erforderliche Faktor und der Offset sind 85 bzw. -128 :

%Vor%

was

ergibt %Vor%     
Luis Mendo 06.08.2015, 10:31
quelle
4

Ich werde Ihnen keine magisch vektorisierte Möglichkeit bieten, dies zu tun, aber ich werde Ihnen einige Daten zur Verfügung stellen, die Ihnen wahrscheinlich bei Ihrer Arbeit helfen werden.

Ihre cumsumlim Funktion ist sehr schnell!

%Vor%

Ich bezweifle wirklich, dass das dein Flaschenhals ist. Haben Sie versucht, den Code zu profilieren ?

    
Stewie Griffin 06.08.2015 08:20
quelle

Tags und Links