Problem mit der Iteration über eine Zeitreihe in clojure

8

Ich habe folgendes Problem: Ich habe eine Zeitreihe mit mehr als 10000 Einträgen und möchte mit jedem von ihnen einige Berechnungen durchführen. Dies allein wäre kein Problem, aber ich muss den letzten berechneten Wert erhalten, um den nächsten zu bekommen. Eine sehr einfache Form von dem, was ich brauche, würde so aussehen:

Val(n) = Val(n-1) + (time-series-entry / 2) (oder so ähnlich!)

Ich habe keine Ahnung, wie ich das schaffen soll. Einfach so etwas tun:

%Vor%

würde nicht funktionieren, weil ich nicht (zumindest ich weiß nicht wie!) den letzten berechneten Wert bekommen kann. Dann dachte ich: OK, lass uns Loop-Recur benutzen. Dies würde mir den Wert geben, der dem Zeitreiheneintrag entspricht, ABER für den nächsten würde ich alle Berechnungen erneut durchführen müssen. Iterate wäre das Richtige, aber es hat nicht funktioniert, weil die Funktion Nebenwirkungen hat.

Also ich stecke hier fest. Es wäre toll, wenn mir jemand einen Hinweis geben könnte.

    
Tiasmadu 13.07.2010, 14:05
quelle

2 Antworten

7

Wenn Sie nur das Endergebnis interessieren, verwenden Sie reduce ; Wenn Sie eine Reihe von Ergebnissen für die Transformation jedes Werts der Reihe nach benötigen (wobei jede Transformation von den vorherigen abhängt), verwenden Sie reductions (gefunden in clojure.contrib.seq-utils in 1.1 und in clojure.core in 1.2).

Im Folgenden macht transform-first-entry was auch immer Sie mit dem ersten Eintrag machen wollen (wenn Sie es nicht transformieren müssen, können Sie das erste Argument auf reduce / reductions weglassen und verwenden entries anstatt (rest entries als letztes Argument); transform-entry ist die Funktion, die das Ergebnis der Transformation des vorherigen Eintrags und des aktuellen Eintrags (in dieser Reihenfolge) übernimmt und das Transformationsergebnis für den aktuellen Eintrag erzeugt.

%Vor%

Beachten Sie, dass reductions faul ist.

Angenommen, Sie möchten den ersten Eintrag unverändert lassen und Ihre Beispieltransformation vom Fragetext auf die nachfolgenden Einträge anwenden, können Sie

verwenden %Vor%

als Reduktionsfunktion in

%Vor%     
Michał Marczyk 13.07.2010 14:49
quelle
3

Wenn Sie nur einen Hinweis möchten; Sehen Sie sich in partition um.

Für ein wenig mehr als einen Hinweis ...

%Vor%

Obwohl dies nicht getestet wurde, sollte es funktionieren oder in der Nähe arbeiten :)

Erläuterung

(partition n i seq) trennt seq in Teile der Liste der Länge n (2 in diesem Fall) mit der Überlappung i (in diesem Fall 1), und dann iterieren wir über denen mit for und tun was wir mit den Teilen wollen.

    
Isaac 13.07.2010 14:22
quelle

Tags und Links