Ich weiß, dies ist erreichbar mit Boost wie pro: Aber ich möchte wirklich vermeiden, mit Boost. Ich habe gegoogelt und keine geeigneten oder lesbaren Beispiele gefunden. Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Gleitkommazahlstroms mit den letzten 1000 Zahlen als Datenprobe verfolgen. Was ist der einfachste Weg, um dies zu erreichen, experimentierte ich mit einem kreisförmigen Array, exponentiellen gleitenden Durchschnitt und einem einfacheren gleitenden Durchschnitt und festgestellt, dass die Ergebnisse aus dem kreisförmigen Array meine Bedürfnisse am besten geeignet. Wenn Ihre Bedürfnisse sind einfach, können Sie nur versuchen, mit einem exponentiellen gleitenden Durchschnitt. Setzen Sie einfach, Sie eine Akkumulator-Variable, und wie Ihr Code sieht auf jede Probe, aktualisiert der Code den Akkumulator mit dem neuen Wert. Sie wählen eine konstante Alpha, die zwischen 0 und 1 ist, und berechnen Sie: Sie müssen nur einen Wert von Alpha zu finden, wo die Wirkung einer gegebenen Probe nur für etwa 1000 Proben dauert. Hmm, Im nicht wirklich sicher, dass dies für Sie geeignet ist, jetzt, dass Ive es hier. Das Problem ist, dass 1000 ist ein ziemlich langes Fenster für einen exponentiellen gleitenden Durchschnitt Im nicht sicher, gibt es ein Alpha, die den Durchschnitt über die letzten 1000 Zahlen, ohne Unterlauf in der Gleitkomma Berechnung. Aber, wenn Sie einen kleineren Durchschnitt wünschen, wie 30 Zahlen oder so, dieses ist eine sehr einfache und schnelle Weise, es zu tun. Beantwortet Jun 12 12 at 4:44 1 auf Ihrem Beitrag. Der exponentielle gleitende Durchschnitt kann zulassen, dass das Alpha variabel ist. Somit kann dies dazu verwendet werden, Zeitbasisdurchschnitte (z. B. Bytes pro Sekunde) zu berechnen. Wenn die Zeit seit dem letzten Akkumulator-Update mehr als 1 Sekunde beträgt, lassen Sie Alpha 1.0 sein. Andernfalls können Sie Alpha zulassen (usecs seit letztem update1000000). Ndash jxh Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Gleitkommazahls mit den neuesten 1000 Zahlen als Datenbeispiel zu verfolgen. Beachten Sie, dass im Folgenden die Summe als Elemente als addiert ergänzt wird, wobei kostspielige O (N) - Transversionen vermieden werden, um die Summe zu berechnen, die für den durchschnittlichen Bedarf erforderlich ist. Insgesamt wird ein anderer Parameter von T gebildet, um z. B. Mit einer langen langen, wenn insgesamt 1000 lange s, eine int für char s, oder eine doppelte bis total float s. Dies ist ein wenig fehlerhaft, dass Nennsignale an INTMAX vorbeiziehen könnten - wenn Sie darauf achten, dass Sie ein langes langes nicht signiertes verwenden konnten. Oder verwenden Sie ein zusätzliches Bool-Datenelement, um aufzuzeichnen, wenn der Container zuerst gefüllt wird, während numsamples rund um das Array (am besten dann umbenannt etwas harmlos wie pos). Man nehme an, daß der quadratische Operator (T-Abtastwert) tatsächlich quadratischer Operator (T-Abtastwert) ist. Ndash oPless Jun 8 14 um 11:52 Uhr oPless ahhh. Gut beobachtet. Eigentlich meinte ich, dass es sich um void operator () (T sample) handelt, aber natürlich könntet ihr auch irgendeine Notation verwenden, die ihr mochtet. Wird beheben, danke. Ndash Ist es möglich, einen gleitenden Durchschnitt in C ohne die Notwendigkeit für ein Fenster von Proben Ive gefunden, dass ich ein bisschen optimieren können, indem Sie eine Fenstergröße, die eine Macht von zwei, um für Bit zu ermöglichen - Schiebung statt zu trennen, aber nicht brauchen einen Puffer wäre schön. Gibt es eine Möglichkeit, ein neues gleitendes Durchschnittsergebnis nur als Funktion des alten Ergebnisses und des neuen Beispiels auszudrücken, definieren Sie einen beispielhaften gleitenden Durchschnitt in einem Fenster von 4 Proben: Add new sample e: Ein gleitender Durchschnitt kann rekursiv implementiert werden , Aber für eine exakte Berechnung des gleitenden Durchschnitts müssen Sie sich an die älteste Eingangsabfrage in der Summe (dh die a in Ihrem Beispiel) erinnern. Für einen N-gleitenden Durchschnitt berechnen Sie: wobei yn das Ausgangssignal und xn das Eingangssignal ist. Gl. (1) können rekursiv geschrieben werden, also müssen Sie sich stets an die Stichprobe xn-N erinnern, um (2) zu berechnen. Wie von Conrad Turner angemerkt, können Sie stattdessen ein (unendlich langes) exponentielles Fenster verwenden, mit dem Sie die Ausgabe nur aus dem vergangenen Ausgang und dem aktuellen Eingang berechnen können. Dies ist jedoch kein normaler (ungewichteter) gleitender Durchschnitt, sondern ein exponentieller Wert Gewogenen gleitenden Durchschnitt, wo die Proben in der Vergangenheit ein geringeres Gewicht erhalten, aber (zumindest in der Theorie) man nie etwas vergessen (die Gewichte nur kleiner und kleiner für Proben weit in der Vergangenheit). Ich habe einen gleitenden Durchschnitt ohne einzelnen Element-Speicher für ein GPS-Tracking-Programm, das ich geschrieben habe. Ich beginne mit 1 Probe und dividiere durch 1, um die aktuelle Durchschn. Ich füge dann anothe Probe und dividiere durch 2 zu den aktuellen Durchschn. Das geht so lange weiter, bis ich auf die Länge des Durchschnitts komme. Jedes Mal danach, füge ich in der neuen Probe, erhalten Sie den Durchschnitt und entfernen Sie diesen Durchschnitt aus der Gesamtmenge. Ich bin kein Mathematiker, aber das schien ein guter Weg, es zu tun. Ich dachte, es würde den Magen eines echten Mathematik-Kerl, aber es stellt sich heraus, es ist eine der akzeptierten Möglichkeiten, es zu tun. Und es funktioniert gut. Denken Sie daran, dass je höher Ihre Länge, desto langsamer folgt es, was Sie folgen wollen. Das kann nicht die meiste Zeit, aber wenn folgende Satelliten, wenn Sie langsam sind, könnte die Spur weit von der tatsächlichen Position und es wird schlecht aussehen. Sie könnten eine Lücke zwischen dem Sat und den nachfolgenden Punkten haben. Ich wählte eine Länge von 15 aktualisiert 6 mal pro Minute, um eine ausreichende Glättung und nicht zu weit von der tatsächlichen Sat-Position mit den geglätteten Spur Punkte erhalten. Antwort # 2 am: November 16, 2010, um 23:03 Uhr Initialisierung insgesamt 0, count0 (jedes Mal, wenn ein neuer Wert dann ein Eingang (scanf), ein add totalnewValue, ein Inkrement (count), ein dividieren Durchschnitt (totalcount) Dies wäre ein gleitender Durchschnitt über Alle Eingänge Um den Durchschnitt über nur die letzten 4 Eingänge zu berechnen, benötigen Sie 4 Inputvariablen, vielleicht kopieren Sie jeden Eingang zu einem älteren inputvariable und berechnen dann den neuen gleitenden Durchschnitt als Summe der 4 Inputvariablen, geteilt durch 4 (Rechtsverschiebung 2 wäre Gut, wenn alle Eingänge waren positiv, um die durchschnittliche Berechnung beantwortet werden 3. Februar um 4:06 Das wird tatsächlich berechnen den Gesamtdurchschnitt und nicht den gleitenden Durchschnitt. Wenn Zähler größer wird der Einfluss eines neuen Eingangsprobe wird verschwindend kleiner ndash Hilmar Feb Ich habe versucht, eine Niederfrequenz Cutoff in c, die im Wesentlichen nimmt einen Strom von Zahlen und glättet zu implementieren (Ausfiltern von hochfrequenter Bewegungsstörung), es ist jedoch wichtig, dass die vorgewichteten Zahlen sofort betrachtet werden, da die Daten zeitkritisch sind (es ist die Steuerung einer Bewegungssimulationsbasis unter Verwendung einer Ausgabe von einer kleinen Spielsoftware). Ive bekam einen funktionierenden gewichteten gleitenden Durchschnitt Algoithm, konnte aber mit etwas ein wenig mehr reagieren an der Vorderseite zu tun, und ich fand dies: - Der Pseudo-Code gibt es wie folgt: Eingaben: Preis (NumericSeries), Period (NumericSimple) Variablen: Faktor 2 (Period1) Verzögerung (Periode-1) 2 Ende sonst beginnen ZLEMA-Faktor (2Price-Pricelag) (1-Faktor) ZLEMA1 Ende Ive übersetzte es in Zu C und mein Code ist wie folgt: Allerdings scheint es nicht so zu verhalten, wie Id erwarten. Es scheint fast da, aber manchmal bekomme ich einen etwas niedrigeren Wert als alle Elemente in der Warteschlange (wenn sie alle höher sind). Meine Warteschlange und die Anzahl der Elemente in ihr als Parameter übergeben werden, mit der jüngsten an der Front zu allen Zeiten, auch ich passieren einen inkrementierenden Zähler beginnend bei 0, wie von der Funktion erforderlich. Ich bin nicht sicher, Ive interpretiert die Bedeutung von ZLEMA1 korrekt als seine nicht klar, in seinem Pseudocode, so dass Ive davon ausgegangen, dass die letzten Anrufe zlema und auch Im Annahme Preis tatsächlich bedeutet Price0. Vielleicht Ive erhielt dieses falsch Ich soll die wirklichen zlema berechneten Werte zurück zu meiner ursprünglichen Warteschlange vor dem folgenden Anruf kopieren Ich ändere nicht die ursprüngliche Warteschlange an allen anderen als nur, alle Werte eins bis zum Ende zu verschieben und das späteste am Anfang einzusetzen . Der Code, den ich verwenden, um dies zu tun ist: Wäre äußerst dankbar, wenn jemand mit einem besseren Verständnis der Mathematik könnte bitte Verstand überprüfen dies für mich zu sehen, ob Ive etwas leicht falsch Vielen Dank im Voraus, wenn Sie helfen können Erstens danke für alle Ihre Eingabe, sehr geschätzt Das macht Sinn, denke ich, so nehme ich an, dann das Beste, das ich hoffen kann, ist einfach ein exponentieller gleitender Durchschnitt, akzeptiert wird es ein wenig Verzögerung, aber dies wird durch die schwerere Front Gewichtung als in typisch gewichtet gegeben minimiert werden Ich habe auch diesen Algorithmus, aber ein ähnliches Problem, dass die Werte nicht ganz richtig erscheinen (es sei denn, dies ist die Art der Formel). Zum Beispiel, sagen, mein Array enthält 16 Werte, alle 0.4775 - die Ausgabe ist 0.4983, aber Id erwarten, dass es 0.4775 Dies schaut nach rechts zu Ihnen. Exponentieller gleitender Durchschnitt. Statischer Schwimmerfaktor 0 statischer Schwimmer lastema 0 float ema if (currentSample lt 1) ema vals0 Faktor 2.0 ((float) numVals) 1.0) sonst ema (Faktor vals0) ((1.0 - Faktor) lastema) lastema ema return ema Umgekehrt, manchmal ist der Ausgang niedriger als jeder und jeder der Eingänge, auch wenn alle höher sind. Es wird auf die gleiche Weise wie zlema (.) Oben mit einem inkrementierenden Zähler aufgerufen. Die Formel und Pseudocode für diese sind hier: - autotradingstrategy. wordpress20091130exponential-moving-average Danke nochmals, entschuldigt sich für mein Missverständnis von einigen der Grundlagen: (Viele Grüße, Chris J Wie für den Code, den ich gepostet, youre Recht über die Array-Größe Situation: Die Filterkonstante ist eine Frequenzabschaltung. Ich habe eine digitale Signalverarbeitung (DSP) für diese Technik. De. wikipedia. orgwi kiLow-pas sfilter ist eine einfache Erklärung. Sie möchten die Discrete-Time-Realisierung. In meinem Fall ist die A die RC-Konstante, über die sie sprechen. Also die Frequenz, die es ausschneidet ist über 1 (2piA). Wenn Sie nicht über ein Verständnis von Frequency-Domain Theorie haben, kann dies kompliziert. In Ihrem Fall, Je höher Sie A, desto niedriger die Frequenz, die dieser Filter zulassen wird, bedeutet, dass es die Kurve aus mehr und mehr glätten wird. Je niedriger Sie es machen, desto mehr Rauschen ist im System erlaubt. Denken Sie daran, dass ein Muss größer oder gleich 1 wirksam sein muss. Ich habe die XLS wieder befestigt, diesmal ohne die wechselnden rand () Zahlen. Passen Sie die A-Konstante an und beobachten Sie, wie es quotsmoothsquot (oder filtert) die hochfrequenten Variationen. 2) Der letzte Punkt des Eingabefeldes hat den letzten Wert. 3) Gleiches gilt für das Ausgabe-Array. Der letzte ist der jüngste Wert. 5) Die NUMVALS ist beliebig. Sie können kontinuierlich auf die Eingabe-und Ausgabe-Array so oft wie youd wie hinzufügen und es würde nicht den Filter. Insbesondere verwendete ich 49 Punkte. Aber ich kann leicht löschen Sie die letzten 20 und die ersten 29 Ausgänge bleiben die gleichen. Die Funktion basiert nicht darauf, wie viele Punkte verwendet werden. Ich möchte erwähnen, dass ich diese Funktion für eine einmalige Konvertierung entwickelt habe. Wenn Sie eine Umwandlung für den nächsten Wert on the fly tun wollten, konnten Sie etwas einfacheres versuchen (wie angebracht). Wieder Im rostig auf c. Ich hoffe, das ist richtig. Das einzige, was Sie benötigen, um zu liefern ist die Eingangs - und Filterkonstante. Lassen Sie mich wissen, wenn dies hilft. AgentenSimple gleitenden Durchschnitt AveragesSimple gleitenden Durchschnitt Sie sind aufgefordert, diese Aufgabe entsprechend der Aufgabe Beschreibung, mit Hilfe einer Sprache, die Sie vielleicht kennen zu lösen. Berechnen der einfachen gleitenden Durchschnitt einer Reihe von Zahlen. Erstellen Sie eine Stateful-Funktionclassinstanz, die eine Periode annimmt und eine Routine zurückgibt, die eine Zahl als Argument annimmt und einen einfachen gleitenden Durchschnitt ihrer Argumente zurückgibt. Ein einfacher gleitender Durchschnitt ist ein Verfahren zum Berechnen eines Durchschnitts eines Stroms von Zahlen durch nur Mittelung der letzten 160 P 160-Nummern aus dem Strom 160, wobei 160 P 160 als Periode bekannt ist. Sie kann implementiert werden, indem eine Initialisierungsroutine mit 160 P 160 als Argument 160 I (P) 160 aufgerufen wird, die dann eine Routine zurückgeben sollte, die, wenn sie mit einzelnen aufeinanderfolgenden Elementen eines Stroms von Zahlen aufgerufen wird, den Mittelwert von (up To), die letzten 160 P 160 von ihnen, rufen Sie diese 160 SMA (). Das Wort 160 stateful 160 in der Aufgabenbeschreibung bezieht sich auf die Notwendigkeit für 160 SMA () 160, sich an bestimmte Informationen zwischen Anrufen zu erinnern: 160 Der Zeitraum 160 P 160 Ein geordneter Container von mindestens den letzten 160 P 160 Nummern von jedem von Seine individuellen Anrufe. Stateful 160 bedeutet auch, dass sukzessive Aufrufe von 160 I (), 160 der Initialisierer, 160 separate Routinen zurückgeben sollten, die 160 nicht den gespeicherten Zustand teilen, so dass sie auf zwei unabhängigen Datenströmen verwendet werden können. Pseudocode für eine Implementierung von 160 SMA 160 ist: Diese Version verwendet eine persistente Warteschlange, um die letzten p-Werte zu halten. Jede Funktion, die von init-moving-average zurückgegeben wird, hat ihren Zustand in einem Atom mit einem Queue-Wert. Diese Implementierung verwendet eine zirkuläre Liste, um die Zahlen in dem Fenster am Anfang jedes Iterationszeigers zu speichern, bezieht sich auf die Listenzelle, die den Wert hält, der sich gerade aus dem Fenster bewegt und durch den gerade addierten Wert ersetzt wird. Verwenden eines Closure-Edit derzeit Diese sma kann nicht nogc, weil es eine Schließung auf dem Heap zugeordnet. Einige Escape-Analyse konnte die Heap-Zuweisung entfernen. Verwenden einer Strukturbearbeitung Diese Version vermeidet die Heapzuweisung des Verschlusses, der die Daten im Stapelrahmen der Hauptfunktion hält. Gleiche Ausgabe: Um zu vermeiden, dass die Gleitkomma-Näherungen aufeinandertreiben und wachsen, kann der Code eine periodische Summe auf dem gesamten kreisförmigen Warteschlangen-Array ausführen. Diese Implementierung erzeugt zwei (Funktions-) Objekte, die den Zustand teilen. Es ist idiomatisch in E, die Eingabe von der Ausgabe (Lesen von Schreiben) zu trennen, anstatt sie zu einem Objekt zu kombinieren. Die Struktur ist die gleiche wie die Implementierung von Standard DeviationE. Das Elixierprogramm unten erzeugt eine anonyme Funktion mit einer eingebetteten Periode p, die als Periode des einfachen gleitenden Durchschnitts verwendet wird. Die run-Funktion liest die numerische Eingabe und übergibt sie an die neu erstellte anonyme Funktion und prüft dann das Ergebnis auf STDOUT. Die Ausgabe ist unten gezeigt, mit dem Durchschnitt, gefolgt von der gruppierten Eingabe, die die Grundlage für jeden gleitenden Durchschnitt bildet. Erlang hat Verschlüsse, aber unveränderliche Variablen. Eine Lösung besteht dann darin, Prozesse und eine einfache Message passing based API zu verwenden. Matrixsprachen haben Routinen, um die Gleitabschnitte für eine gegebene Reihenfolge von Elementen zu berechnen. Es ist weniger effizient Schleife wie in den folgenden Befehlen. Fordert kontinuierlich einen Eingang I auf. Die dem Ende einer Liste L1 hinzugefügt wird. L1 kann durch Drücken von 2ND1 gefunden werden, und Mittelwert kann in ListOPS gefunden werden. Drücken Sie ON, um das Programm zu beenden. Funktion, die eine Liste mit den gemittelten Daten des bereitgestellten Arguments zurückgibt Programm, das bei jedem Aufruf einen einfachen Wert zurückgibt: list ist die gemittelte Liste: p ist die Periode: 5 gibt die gemittelte Liste zurück: Beispiel 2: Verwenden des Programms movinav2 (i , 5) - Initialisieren der gleitenden Durchschnittsberechnung und Definieren des Zeitraums von 5 movinav2 (3, x): x - neue Daten in der Liste (Wert 3), und das Ergebnis wird auf der Variablen x gespeichert und movinav2 (4, : X - neue Daten (Wert 4), und das neue Ergebnis wird auf Variable x gespeichert und angezeigt (43) 2. Beschreibung der Funktion movinavg: Variable r - ist das Ergebnis (die gemittelte Liste), die zurückgegeben wird Variable i - ist die Index-Variable, und es zeigt auf das Ende der Unterliste die Liste gemittelt wird. Variable z - eine Helpervariable Die Funktion nutzt die Variable i, um zu bestimmen, welche Werte der Liste bei der nächsten Durchschnittsberechnung berücksichtigt werden. Bei jeder Iteration zeigt die Variable i auf den letzten Wert in der Liste, der in der Durchschnittsberechnung verwendet wird. Also müssen wir nur herausfinden, welcher der erste Wert in der Liste sein wird. Normalerweise müssen p Elemente berücksichtigt werden, also wird das erste Element dasjenige sein, das durch (i-p1) indexiert wird. Jedoch wird bei den ersten Iterationen die Berechnung gewöhnlich negativ sein, so daß die folgende Gleichung negative Indexe vermeiden wird: max (i-p1,1) oder die Anordnung der Gleichung max (i-p, 0) 1. Die Anzahl der Elemente auf den ersten Iterationen wird ebenfalls kleiner sein, der korrekte Wert ist (Endindex - Anfangsindex 1) oder die Anordnung der Gleichung (i - (max (ip, 0) 1) 1) , (I-max (ip, 0)). Die Variable z enthält den gemeinsamen Wert (max (ip), 0), so dass der Anfangsindex (z1) ist und die Anzahl der Elemente (iz) mid (Liste, z1, iz) Die Summe (.) (Iz) ri wird sie mitteln und das Ergebnis an der entsprechenden Stelle in der Ergebnisliste speichern fp1 erzeugt eine Teilanwendung, die den (in diesem Fall) zweiten und dritten Parameter fixiert
No comments:
Post a Comment