Saturday 21 January 2017

Moving Durchschnitt Clojure

An diesem Wochenende habe ich beschlossen, meine Hand an einigen Scala und Clojure versuchen. Im kompetent mit objektorientierten Programmierung, und so Scala war leicht zu holen als eine Sprache, wollte aber versuchen, funktionale Programmierung. Hier wurde es hart. Ich kann nur scheinen, um meinen Kopf in eine Art des Schreibens von Funktionen. Wie kommen Sie zu einem Problem? Wenn Sie eine Liste von Werten und einen definierten Summationszeitraum erhalten, wie würden Sie eine neue Liste mit dem einfachen gleitenden Durchschnitt der Liste generieren. Beispiel: Angesichts der Listenwerte (2.0, 4.0 , 7,0, 6,0, 3,0, 8,0, 12,0, 9,0, 4,0, 1,0) und die Periode 4 sollte die Funktion zurückkehren: (0,0, 0,0, 0,0, 4,75, 5,0, 6,0, 7,25, 8,0, 8,25, 6,5) Was ich in Scala tun konnte, war das: Ich weiß, das ist schrecklich ineffizient, Id viel eher etwas wie: Nun, das wäre leicht in einem imperativen Stil, aber ich kann nicht für das Leben Von mir heraus, wie man das funktional ausdrücken. Interessantes Problem. Ich kann viele Lösungen mit unterschiedlichem Wirkungsgrad vorstellen. Das Hinzufügen von Material wiederholt ist nicht wirklich ein Leistungsproblem, aber lassen Sie annehmen, dass es ist. Auch die Nullen am Anfang können später vorangestellt werden, so lässt sich keine Sorgen über die Herstellung von ihnen. Wenn der Algorithmus sie natürlich zur Verfügung stellt, wenn nicht, dann korrigieren wir ihn später. Beginnend mit Scala 2.8, würde die folgenden geben das Ergebnis für n gt Periode, indem Sie gleitend, um ein Schiebefenster der Liste zu erhalten: Dennoch, obwohl dies ziemlich elegant ist, hat es nicht die beste Leistung möglich, weil es nicht nutzen bereits Berechneten Additionen. Also, von ihnen zu sprechen, wie können wir sie Lets sagen, wir schreiben: Wir haben eine Liste der Summe von jeweils zwei Paare. Lets versuchen, dieses Ergebnis zu verwenden, um den gleitenden Durchschnitt von 4 Elementen zu berechnen. Die obige Formel hat die folgende Berechnung: Wenn wir jedes Element nehmen und es dem zweiten nächsten Element hinzufügen, erhalten wir den gleitenden Durchschnitt für 4 Elemente: Wir können es so machen: Wir könnten dann den gleitenden Durchschnitt für 8 Elemente berechnen, und so weiter. Nun, es gibt einen bekannten Algorithmus, um Dinge zu berechnen, die einem solchen Muster folgen. Seine bekannteste für seine Verwendung auf die Berechnung der Leistung einer Zahl. Es geht so: So, können wir es hier anwenden: So, heres die Logik. Periode 0 ist ungültig, Periode 1 ist gleich der Eingabe, Periode 2 ist gleitendes Fenster der Größe 2. Wenn sie größer ist, kann sie gerade oder ungerade sein. Wenn ungerade, addieren wir jedes Element zum movingSum der nächsten (ungerade - 1) Elemente. Zum Beispiel, wenn 3, fügen wir jedes Element zum movingSum der nächsten 2 Elemente. Wenn auch, berechnen wir die movingSum für n / 2. dann fügen Sie jedes Element, um die ein n / 2 Schritte danach. Mit dieser Definition können wir dann zurück auf das Problem und tun dies: Theres eine leichte Ineffizienz in Bezug auf die Verwendung von. Aber seine O (Periode), nicht O (values. size). Sie kann mit einer tail-rekursiven Funktion effizienter gestaltet werden. Und natürlich ist die Definition von Sliding ich bereitgestellt ist schrecklich performance-weise, aber es wird eine viel bessere Definition von es auf Scala 2.8. Beachten Sie, dass wir nicht eine effiziente Gleitmethode auf einer Liste. Aber wir können es auf einem Iterable tun. Having said all das, Id gehen mit der allerersten Definition und optimieren nur, wenn eine kritische Pfadanalyse festgestellt, dies als eine große Sache. Abschließend betrachten wir, wie ich ging über das Problem. Wir haben ein gleitendes Durchschnittsproblem. Ein gleitender Durchschnitt ist die Summe eines sich bewegenden Fensters auf einer Liste, geteilt durch die Größe dieses Fensters. Also, zuerst, ich versuche, ein Schiebefenster, Summe alles auf sie zu bekommen, und dann durch die Größe teilen. Das nächste Problem war die Wiederholung bereits berechneter Additionen zu vermeiden. In diesem Fall ging ich auf die kleinste Möglichkeit möglich, und versuchte herauszufinden, wie die Berechnung größerer Summen Wiederverwendung solcher Ergebnisse. Schließlich können wir versuchen, das Problem zu lösen, wie Sie es dachten, durch Hinzufügen und Subtrahieren aus dem vorherigen Ergebnis. Der erste Durchschnitt ist einfach: Jetzt machen wir zwei Listen. Zuerst die Liste der zu subtrahierenden Elemente. Als Nächstes wird die Liste der hinzuzufügenden Elemente hinzugefügt: Wir können diese beiden Listen mithilfe von zip hinzufügen. Diese Methode erzeugt nur so viele Elemente wie die kleinere Liste, die das Problem vermeidet, dass Subtraktion größer als notwendig ist: Wir beenden, indem wir das Ergebnis mit einer Falte zusammensetzen, die die Antwort ist, die zurückgegeben werden soll. Die ganze Funktion sieht so aus: Ich kenne Clojure besser als Scala, also hier. Ich schreibe dies die anderen Clojure Eintrag hier ist zwingend, dass nicht wirklich, was youre nach (und isnt idiomatischen Clojure). Der erste Algorithmus, der mir in den Sinn kommt, wiederholt die geforderte Anzahl von Elementen aus der Sequenz, das erste Element fallenlassen und wiederkehren. Die folgenden Werke auf jede Art von Sequenz (Vektor oder Liste, faul oder nicht) und gibt eine lazy Sequenz von Durchschnitten --- das könnte hilfreich sein, wenn Sie auf einer Liste von unbestimmter Größe arbeiten. Beachten Sie, dass es kümmert sich um die Basis Fall durch implizite Rückgabe von nil, wenn es reicht genug Elemente in der Liste zu konsumieren. Ausführen dieser auf Ihre Testdaten liefert Es gibt nicht 0 für die ersten paar Elemente in der Sequenz, obwohl das leicht gehandhabt werden könnte (etwas künstlich). Die einfachste Sache von allen ist, das Muster zu sehen und in der Lage sein, um eine verfügbare Funktion, die die Rechnung passt zu erinnern. Partition gibt eine faulen Blick auf Teile einer Sequenz, die wir dann über Karte: Jemand bat um einen Schwanz rekursive Version Schwanz Rekursion vs Faulheit ist ein bisschen Kompromiss. Wenn Ihr Job ist die Erstellung einer Liste dann machen Ihre Funktion tail rekursive ist in der Regel ziemlich einfach, und dies ist keine Ausnahme --- nur aufbauen die Liste als Argument für eine Unterfunktion. Nun sammeln sich zu einem Vektor statt einer Liste, weil sonst die Liste wird rückwärts aufgebaut werden und müssen am Ende umgekehrt werden. Schleife ist ein Weg, um eine anonyme innere Funktion (Art von wie Schemen namens let) recur in Clojure verwendet werden, um Schwanz Anrufe zu beseitigen verwendet werden. Konj ist eine generalisierte Nachteile. Anhängen in der Weise natürlich für die Sammlung --- der Beginn der Listen und das Ende der Vektoren. Antwortete Aug 24 09 am 2:58 I39ve entschied, dieses alte Q hinzuzufügen, weil das Thema wieder oben kam (Stackoverflow / questions / 2359821 / hellip) und ich finde es vorzuziehen, auf diese nette Ansammlung mögliche Lösungen beim Hinzufügen meines eigenen zu zeigen (Was sich von den früheren Versionen in Clojure unterscheidet, wie in der A erläutert). Vielleicht können wir die Web39s die meisten kompletten Repository von funktionalen mov-avg-Implementierungen zu bauen) ndash Micha Marczyk Mar 2 10 um 0:20 Heres eine teilweise Punkt-freie eine Zeile Haskell Lösung: Zuerst gilt Schwanz, um die Liste der Schwänze zu erhalten , So: Reversiert es und löscht die ersten P-Einträge (wobei p als 2 hier gilt): Falls Sie mit dem (.) Punkt / Nippel-Symbol vertraut sind, ist es der Operator für die funktionale Komposition, dh er übergibt die Ausgabe einer Funktion Als die Eingabe eines anderen, indem sie sie in einer einzigen Funktion. (F) bedeutet, daß f auf einen Wert f gegangen ist, dann den Ausgang zu g, so daß ((f)) x) derselbe ist wie (g (f x)). Im Allgemeinen führt seine Verwendung zu einem klareren Programmierstil. Sie ordnet dann die Funktion ((/ (vonIntegral p)), sum. Take p) auf die Liste auf. Also für jede Liste in der Liste nimmt es die ersten p Elemente, summiert sie, teilt sie dann durch p. Dann drehen wir die Liste einfach wieder zurück. Dies alles sieht viel mehr ineffizient, als es umgekehrt ist physisch umgekehrt die Reihenfolge einer Liste, bis die Liste ausgewertet wird, es nur legt es auf den Stapel (gute ol faul Haskell). Schwänze erstellt auch nicht alle diese separaten Listen, es nur Referenzen verschiedene Abschnitte der ursprünglichen Liste. Seine noch keine große Lösung, aber es eine Zeile lang :) Heres eine etwas schönere aber längere Lösung, die mapAccum verwendet, um eine gleitende Subtraktion und Addition zu tun: Zuerst teilen wir die Liste in zwei Teile auf p, also: Summe das erste Bit: Zip das zweite Bit mit der ursprünglichen Liste (dies nur Paare aus Artikel in der Reihenfolge von den beiden Listen). Die ursprüngliche Liste ist offensichtlich länger, aber wir verlieren dieses Extra-Bit: Jetzt definieren wir eine Funktion für unser mapAccum (ulator). MapAccumL ist das gleiche wie eine Karte, aber mit einem zusätzlichen Laufzustand / Akkumulator-Parameter, der von der vorherigen Zuordnung an die nächste übergeben wird, während die Karte durch die Liste läuft. Wir verwenden den Akkumulator als unseren gleitenden Durchschnitt, und da unsere Liste aus dem Element besteht, das soeben das Schiebefenster und das Element eingegeben hat, das gerade eingegeben wurde (die Liste, die wir gerade gezippt haben), nimmt unsere Schiebefunktion die erste Zahl x weg von Der Durchschnitt und addiert die zweite Zahl y. Dann passieren wir das neue s und geben s dividiert durch p zurück. Snd (second) nimmt nur das zweite Element eines Paares (Tupel), das verwendet wird, um den zweiten Rückgabewert von mapAccumL zu nehmen, da mapAccumL sowohl den Akkumulator als auch die abgebildete Liste zurückgibt. Für diejenigen von Ihnen nicht vertraut mit dem Symbol. Es ist der Anwendungsoperator. Es tut wirklich nichts, aber es hat eine niedrige, rechts-assoziative verbindliche Präzedenz, so bedeutet es, dass Sie die Klammern lassen können (beachten Sie LISPers), dh (fx) ist das gleiche wie fx Running (ma 4 2.0, 4.0, 7,0, 6,0, 3,0, 8,0, 12,0, 9,0, 4,0, 1,0) ergibt für beide Lösungen 4,75, 5,0, 6,0, 7,25, 8,0, 8,25, 6,5. Oh und youll müssen die Modul-Liste zu importieren, um eine Lösung zu kompilieren. Daniel Danke Das Schreiben von Code ist viel einfacher als es zu erklären -) Du hast das Wesentliche beschrieben. Zwei Lists / Streams werden in beiden Funktionen beibehalten und erhalten ihre quotheadsquot während jeder Iteration entfernt. Eine Liste / Stream dient als Hauptkollektion, um durchzulaufen, während die andere Liste / Stream, die die gleiche Sammlung ist, mit der Ausnahme, dass die Quotperiode weniger Doubles weggenommen wird, bei der Berechnung des neuen gleitenden Durchschnitts verwendet wird. Ndash Walter Chang Aug 24 09 at 17:19 Die Programmiersprache J erleichtert Programme wie gleitenden Durchschnitt. In der Tat gibt es weniger Zeichen in (/) als in ihrem Label, gleitenden Durchschnitt. Für die in dieser Frage (einschließlich der Namenwerte) angegebenen Werte ist hier ein einfacher Weg, dies zu kodieren: Wir können dies beschreiben, indem wir Etiketten für Komponenten verwenden. Beide Beispiele verwenden genau das gleiche Programm. Der einzige Unterschied ist die Verwendung von mehr Namen in der zweiten Form. Solche Namen können Lesern helfen, die die J Vorwahlen nicht kennen. Lets sehen ein bisschen weiter in was ist los im Unterprogramm, Durchschnitt. / Bezeichnet summation () und bezeichnet die Division (wie das klassische Zeichen). Die Berechnung einer Tally (Anzahl) von Elementen erfolgt durch. Das Gesamtprogramm ist also die Summe der Werte dividiert durch die Wertekalkulation: / Das Ergebnis der hier eingeschriebenen gleitenden Durchschnittsberechnung enthält nicht die führenden Nullen, die in der ursprünglichen Frage erwartet werden. Diese Nullen sind wohl nicht Teil der beabsichtigten Berechnung. Die hier verwendete Technik wird stillschweigende Programmierung genannt. Es ist so ziemlich das gleiche wie die Punkt-freie Art der funktionalen Programmierung. Antwort # 3 am: August 26, 2010, um 16:15 Uhr Hier ist Clojure vorgibt, eine funktionale Sprache sein. Dies ist vollständig tail-rekursiv, btw, und enthält führende Nullen. Normalerweise habe ich die Sammlung oder Liste Parameter zuletzt, um die Funktion einfacher zu Curry. Aber in Clojure. Ist so mühsam, ich normalerweise am Ende dabei. In diesem Fall ist es nicht wirklich wichtig, welche Reihenfolge die Parameter gehen. Beantwortet Aug 24 09 at 4:56 Hallo Jonathan, I39m ziemlich neu in dieser funktionalen Programmierung, können Sie mir bitte erklären, wie dies ist tail-recursive Dank ndash James P Aug 24 09 at 14:38 Die Rekursion geschieht auf der if-Anweisung, Wo jede Option auf recur basiert. Dies wird jeden Parameter zuerst berechnen und nur dann rekursieren. Die Antwort ist das Ergebnis von recur. Als Ergebnis ist das gleiche Ergebnis von der Rekursion zurückgegeben, ohne andere Berechnungen, das ist Schwanz rekursiv. Ndash Daniel C. Sobral Dieses Beispiel nutzt Zustand, da für mich seine eine pragmatische Lösung in diesem Fall, und eine Schließung, um die Fensterung Mittelung Funktion zu schaffen: Es ist immer noch funktionell im Sinne der Nutzung Von erstklassigen Funktionen, obwohl es nicht Nebenwirkung frei ist. Die beiden genannten Sprachen laufen auf der JVM und erlauben somit bei Bedarf auch das State-Management. Beantwortet Aug 24 09 at 1:55 Diese Lösung ist in Haskell, die mir mehr vertraut ist: beantwortet Aug 24 09 at 10:23 Ich mag die Verwendung der Spiel-Anweisung. Ich habe versucht, etwas ähnliches, aber couldn39t ganz machen es den ganzen Weg gibt. Ndash James P Aug 24 09 at 14:39 Eine kurze Clojure-Version, die den Vorteil hat, O (Liste Länge) unabhängig von Ihrer Periode: Dies nutzt die Tatsache, dass Sie die Summe aus einem Bereich von Zahlen berechnen können, indem Sie eine kumulative Summe Der Sequenz (zB 1 2 3 4 5 - 0 1 3 6 10 15) und dann Subtraktion der beiden Zahlen mit einem Versatz gleich Ihrem Zeitraum. Als ich spät auf der Party war und auch in der funktionalen Programmierung neu war, kam ich zu dieser Lösung mit einer inneren Funktion: Ich nahm die Idee an, die ganze Liste im Voraus durch die Periode (len) zu teilen. Dann generiere ich die Summe für die len-first-Elemente. Und ich generiere die ersten, ungültigen Elemente (0.0, 0.0.). Dann rekursiv subtrahieren die erste und fügen Sie den letzten Wert. Am Ende liste ich das Ganze auf. Antwortete Haskell Pseudocode: (Nun sollte man wirklich die 4 out out.) Antwort: Der Schlüssel ist die Tails-Funktion, die eine Liste, um eine Liste der Kopien des Originals Liste mit der Eigenschaft, dass das n-te Element des Ergebnisses die ersten n-1 Elemente fehlt. Wir verwenden fmap (durchführen n), das heißt, wir nehmen die n-Länge Präfix aus der Unterliste, und berechnen ihre avg. Wenn die Länge der Liste, die wir durchlaufen, nicht n ist, dann berechnen wir nicht den Durchschnitt (da er undefiniert ist). In diesem Fall kehren wir nichts zurück. Wenn es ist, tun wir, und wickeln Sie es in Just. Schließlich führen wir catMaybes auf das Ergebnis von fmap (durchführen von n), um den Maybe-Typ loszuwerden. Ich war (überrascht und) enttäuscht von der Leistung von dem, was mir schien, die meisten idiomatischen Clojure Lösungen, JamesCunningham s Lazy-seq Lösungen. Es handelt sich also um eine Kombination von James-Lösung mit DanielC. Sobral's Idee, schnelle Exponentiation an bewegte Summen anzupassen: Edit: Diese - auf mikera s Lösung basierende - ist noch schneller. Beantwortet Jul 22 13 um 19:21 Deine Antwort 2016 Stack Exchange, IncClojure Gleitender Durchschnitt von Java zu Clojure Clojure hat eine clojure. lang. PersistentQueue, um mit Warteschlangen zu arbeiten. Ich weiß nicht, warum es doesn39t haben ein Reader-Makro, sondern funktioniert gut und gibt Ihnen eine Clojure-Kollektion, die Sie mit Nachteile und Peek behandeln können. Sie können mit einer leeren Warteschlange mit clojure. lang. PersistentQueue / EMPTY beginnen oder Ihre Objekte in den Konstruktor einfügen. Ich schrieb etwas Material darüber in Portugiesisch, wenn Sie Interesse haben. Am 20/07/2014, um 08:48, schrieb Cecil Westerhof: Ich frage mich nur: was ist der beste Weg, um dies zu übersetzen Clojure Im Moment hat Clojure keine Warteschlange. Sollte ich einfach die Java-Anrufe verwenden, oder gibt es einen besseren Weg - Cecil Westerhof - Sie haben diese Nachricht erhalten, da Sie die Gruppe "Google Groups quotClojurequot" abonniert haben. Um in diese Gruppe zu schreiben, senden Sie eine E-Mail an clojuregooglegroups Beachten Sie, dass Beiträge von neuen Mitgliedern moderiert werden - bitte gedulden Sie sich mit Ihrem ersten Beitrag. Wenn Sie sich von dieser Gruppe abmelden möchten, senden Sie eine E-Mail an clojure unsubscribegooglegroups Weitere Optionen finden Sie unter groups. google/group/clojurehlen --- Sie haben diese Nachricht erhalten, da Sie die Gruppe "Google Groups quotClojurequot" abonniert haben. Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr erhalten möchten, senden Sie eine E-Mail an clojureunsubscribegooglegroups. Weitere Optionen finden Sie unter groups. google/d/optout. - Sie haben diese Nachricht erhalten, da Sie die Gruppe Google Groups quotClojurequot abonniert haben. Um in diese Gruppe zu schreiben, senden Sie eine E-Mail an clojuregooglegroups Beachten Sie, dass Beiträge von neuen Mitgliedern moderiert werden - bitte gedulden Sie sich mit Ihrem ersten Beitrag. Wenn Sie sich von dieser Gruppe abmelden möchten, senden Sie eine E-Mail an clojure unsubscribegooglegroups Weitere Optionen finden Sie unter groups. google/group/clojurehlen --- Sie haben diese Nachricht erhalten, da Sie die Gruppe "Google Groups quotClojurequot" abonniert haben. Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr erhalten möchten, senden Sie eine E-Mail an clojureunsubscribegooglegroups. Weitere Optionen finden Sie unter groups. google/d/optout. Mike Fikes Es ist tatsächlich eine Warteschlangen-Implementierung. Hier ist eine Möglichkeit, es für Ihr Problem zu verwenden: (defn make-moving-average-queue n (atom)) (defn update-moving-average-queue old-queue next-value (let current - (Alt (old-values ​​old-queue) nächster Wert) (if (gt (count old-values)) (: length old-queue)) (let current-total Hier ist ein Weg, um es für Ihr Problem zu verwenden: (defn make-moving-durchschnittliche Warteschlange n (atom: current-total 0.0 : Old-values ​​(clojure. lang. PersistentQueue / EMPTY))) (defn update-gleitende durchschnittliche Warteschlange old-queue next-value) - values ​​(conj (: old-values ​​old-queue) nächster Wert) (if (gt (count old-values) (: length old-queue)) (let current-total (- current-total (erste alte Werte ) Old-values ​​(alte Werte old-values) (assoc old-warteschlange: current-total current-total: old-values ​​old-values)) (assoc old-queue: Werte)))) (defn gleitende durchschnittliche alte Warteschlange nächster Wert) (/ (: aktuelle Gesamt-Warteschlange) (count (Defe Eingänge-06 20 22 21 24 24 23 25 26 20 24 26 26 25 27 28 27) (def-queue-06 (make-gleitende mittlere Warteschlange 6)) 29 27 25 24) (doseq Eingangseingänge-06 (println (gleitender Mittelwert der Warteschlange-06 Eingang))) (def queue-10 (make-moving-average-queue 10)) (def inputs-10 20 22 24 25 23 Sie haben diese Meldung erhalten, da Sie die Gruppe "Google Groups quotClojurequot" abonniert haben. (Sie erhalten die Eingaben -10 (println (gleitender Durchschnitt der Warteschlange-10))). Um in diese Gruppe zu schreiben, senden Sie eine E-Mail an clojuregooglegroups Beachten Sie, dass Beiträge von neuen Mitgliedern moderiert werden - bitte gedulden Sie sich mit Ihrem ersten Beitrag. Wenn Sie sich von dieser Gruppe abmelden möchten, senden Sie eine E-Mail an clojure unsubscribegooglegroups Weitere Optionen finden Sie unter groups. google/group/clojurehlen --- Sie haben diese Nachricht erhalten, da Sie die Gruppe "Google Groups quotClojurequot" abonniert haben. Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr erhalten möchten, senden Sie eine E-Mail an clojureunsubscribegooglegroups. Weitere Optionen finden Sie unter groups. google/d/optout. Mike Fikes Hey Cecil, Neben der Verwendung von Peek anstelle von ersten, wie durch Plinio angezeigt, die Moving-Average-Funktion oben verwendet einige schlechte Namen, im Nachhinein, vor allem die quotold-queuequot Parameternamen. I39d vorschlagen, benennen sie Warteschlange, da es sich auf ein Atom bezieht. Man könnte sogar erwägen, die Funktion moving-average zu benennen. - Sie haben diese Nachricht erhalten, da Sie die Gruppe Google Groups quotClojurequot abonniert haben. Um in diese Gruppe zu senden, senden Sie eine E-Mail an eine E-Mail-geschützte Hinweis, dass die Beiträge von neuen Mitgliedern am 20. Juli 2014 um 13.52 Uhr Neben der Verwendung von peek statt der ersten, wie durch Plinio, die gleitende durchschnittliche Funktion oben verwendet einige verwendet Schlechte Namen, im Nachhinein, vor allem die quotold-queuequot Parameternamen. I39d vorschlagen, benennen sie Warteschlange, da es sich auf ein Atom bezieht. Man könnte sogar erwägen, die Funktion moving-average zu benennen. - Sie haben diese Nachricht erhalten, da Sie die Gruppe Google Groups quotClojurequot abonniert haben. Um in diese Gruppe zu schreiben, senden Sie eine E-Mail an clojuregooglegroups Beachten Sie, dass Beiträge von neuen Mitgliedern moderiert werden - bitte gedulden Sie sich mit Ihrem ersten Beitrag. Wenn Sie sich von dieser Gruppe abmelden möchten, senden Sie eine E-Mail an clojure unsubscribegooglegroups Weitere Optionen finden Sie unter groups. google/group/clojurehlen --- Sie haben diese Nachricht erhalten, da Sie die Gruppe "Google Groups quotClojurequot" abonniert haben. Um sich von dieser Gruppe abzumelden und den Empfang von E-Mails zu verhindern, senden Sie eine E-Mail an clojureunsubscribegooglegroups. Weitere Optionen finden Sie unter groups. google/d/optout. Jony Hudson Wahrscheinlich nicht die Antwort, die Sie suchen, aber der exponentiell gewichtete gleitende Durchschnitt doesn39t erfordern einen anderen Zustand als den aktuellen Wert: (defn ewma alpha (fn avg new ((- 1 alpha) avg (alpha new))) ) Jony - Sie haben diese Nachricht erhalten, da Sie die Gruppe "Google Groups quotClojurequot" abonniert haben. Um in diese Gruppe zu schreiben, senden Sie eine E-Mail an eine E-Mail-geschützte Hinweis, dass Beiträge von neuen Mitgliedern moderiert werden - bitte gedulden Sie sich mit Ihrem ersten Beitrag. Um sich von dieser Gruppe abzumelden, senden Sie am Sonntag, 20 Juli 2014 12:48:19 UTC1, Cecil Westerhof schrieb: oder gibt es einen besseren Weg Wahrscheinlich nicht die Antwort, die Sie suchen, aber die exponentiell gewichteten gleitenden Durchschnitt doesn39t erfordern einen anderen Staat Als der aktuelle Wert: (defn ewma alpha (fn avg new ((- 1 alpha) avg) (alpha new)))) - Sie haben diese Nachricht erhalten, da Sie die Gruppe Google Groups quotClojurequot abonniert haben. Um in diese Gruppe zu schreiben, senden Sie eine E-Mail an clojuregooglegroups Beachten Sie, dass Beiträge von neuen Mitgliedern moderiert werden - bitte gedulden Sie sich mit Ihrem ersten Beitrag. Wenn Sie sich von dieser Gruppe abmelden möchten, senden Sie eine E-Mail an clojure unsubscribegooglegroups Weitere Optionen finden Sie unter groups. google/group/clojurehlen --- Sie haben diese Nachricht erhalten, da Sie die Gruppe "Google Groups quotClojurequot" abonniert haben. Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr erhalten möchten, senden Sie eine E-Mail an clojureunsubscribegooglegroups. Weitere Optionen finden Sie unter groups. google/d/optout.


No comments:

Post a Comment