Bewegungsdurchschnitt Ohne Überlauf


Ich weiß, das ist erreichbar mit Boost wie pro. But ich wirklich gerne vermeiden, Boost Ich habe gegoogelt und nicht gefunden, keine geeigneten oder lesbaren Beispiele. Basisch möchte ich den gleitenden Durchschnitt eines laufenden Streams von einem Strom von Gleitkommazahlen zu verfolgen Mit den neuesten 1000 Nummern als Datenbeispiel. Was ist der einfachste Weg, dies zu erreichen. Ich experimentierte mit der Verwendung eines kreisförmigen Arrays, exponentiell gleitenden Durchschnitt und ein einfacher gleitender Durchschnitt und festgestellt, dass die Ergebnisse aus dem kreisförmigen Array passte meine Bedürfnisse am besten Wenn Sie Ihre Bedürfnisse einfach sind, können Sie nur versuchen, einen exponentiellen gleitenden Durchschnitt zu verwenden. Einfach nur, Sie machen eine Akkumulatorvariable, und wie Ihr Code bei jedem Sample sieht, aktualisiert der Code den Akkumulator mit dem Neuer Wert Du wählst eine konstante Alpha, die zwischen 0 und 1 ist, und berechnen dies. Sie müssen nur einen Wert von Alpha finden, wo die Wirkung einer bestimmten Probe nur für etwa 1000 Proben dauert. Hmm, ich bin nicht wirklich sicher, dass dies ist Passend für dich, jetzt da ich es hier hingelegt Das Problem ist, dass 1000 ein ziemlich langes Fenster für einen exponentiellen gleitenden Durchschnitt ist Ich bin mir nicht sicher, dass es ein Alpha gibt, das den Durchschnitt über die letzten 1000 Zahlen verbreiten würde, ohne Unterströmung im Floating Punkt-Berechnung Aber wenn Sie einen kleineren Durchschnitt wünschen, wie 30 Zahlen oder so, ist dies eine sehr einfache und schnelle Art und Weise zu tun it. answered Jun 12 12 bei 4 44. 1 auf Ihrem Beitrag Der exponentielle gleitende Durchschnitt kann das Alpha zu sein Variable So ermöglicht dies die Berechnung von Zeitbasis-Mittelwerten zB Bytes pro Sekunde Wenn die Zeit seit dem letzten Akkumulator-Update mehr als 1 Sekunde ist, lassen Sie alpha 1 1 sein. Andernfalls können Sie alpha be usecs seit letztem Update 1000000 jxh Jun 12 12 at 6 21.Basically Ich möchte den gleitenden Durchschnitt eines laufenden Streams von einem Strom von Gleitkommazahlen mit den neuesten 1000 Zahlen als Datenbeispiel verfolgen. Hinweis, dass die unten die Gesamtsumme als Elemente als hinzugefügt ersetzt ersetzt, vermeiden Kostspielig, um die Summe zu berechnen, die für den Durchschnitt benötigt wird - auf Nachfrage. Total ist ein anderer Parameter von T zu unterstützen, zB mit einer langen langen, wenn insgesamt 1000 lang s, ein int für char s oder ein doppeltes zu total float s. Dies ist ein bisschen fehlerhaft, dass Numsamples an INTMAX vorbeikommen könnten - wenn Sie sich vorstellen können, dass Sie eine lange Zeit langer Zeit verwenden können oder ein zusätzliches bool Datenelement verwenden, um aufzuzeichnen, wann der Container zum ersten Mal gefüllt wird, während er Numsamples um das Array herumtreibt und dann etwas Unschuldiges umbenannt hat Wie pos. answered 12. Juni 12 bei 5 19.on geht davon aus, dass void Operator T Probe tatsächlich void Operator T Probe oPless Jun 8 14 bei 11 52. oPless ahhh gut gesichtet tatsächlich ich bedeutete, dass es void Betreiber T Probe aber natürlich Sie könnten verwenden, was Notation Sie mochten, beheben, danke Tony D Juni 8 14 um 14 27. Ich versuche, einen Weg zu finden, um einen bewegten kumulativen Durchschnitt zu berechnen, ohne die Zählung und die Gesamtdaten zu speichern, die bis jetzt empfangen wurde. Ich kam mit Zwei Algorithmen, aber beide müssen die count. new durchschnittlichen alten Zählung alten Daten nächsten Daten nächsten count. new durchschnittlichen alten durchschnittlichen nächsten Daten - alten durchschnittlichen nächsten count. The Problem mit diesen Methoden ist, dass die Zählung wird größer und größer, was zu verlieren Präzision zu speichern In der daraus resultierenden durchschnittlich. Die erste Methode nutzt die alte Zählung und die nächste Zählung, die offensichtlich 1 auseinander Dies hat mir denke, dass vielleicht gibt es einen Weg, um die Zählung zu entfernen, aber leider habe ich es noch nicht gefunden Es hat mich ein bisschen weiter aber , Was in der zweiten Methode, aber immer noch zählen ist vorhanden. Ist es möglich, oder bin ich nur auf der Suche nach der unmöglich. sced Sep 28 12 bei 8 46.Ist es möglich, einen gleitenden Durchschnitt in C ohne die Notwendigkeit für ein Fenster von Samples. Ich habe festgestellt, dass ich ein bisschen optimieren kann, indem ich eine Fenstergröße wähle, die eine Kraft von zwei für Bit-Shifting statt zu teilen, aber nicht brauchen einen Puffer wäre schön Gibt es eine Möglichkeit, einen neuen gleitenden Durchschnitt auszudrücken Resultiere nur als eine Funktion des alten Ergebnisses und des neuen Samples. Denken Sie ein Beispiel gleitenden Durchschnitt, über ein Fenster von 4 Samples zu. Add neue Probe eA gleitenden Durchschnitt kann rekursiv implementiert werden, aber für eine genaue Berechnung der gleitenden Durchschnitt Sie Muss sich an die älteste eingegebene Stichprobe in der Summe erinnern, dh die a in deinem Beispiel Für eine Länge N gleitenden Durchschnitt rechnen sie. wo yn ist das Ausgangssignal und xn ist das Eingangssignal Eq 1 kann rekursiv geschrieben werden. So müssen Sie immer auch Erinnere dich an die Probe x nN, um zu berechnen 2.As, die von Conrad Turner hervorgehoben werden, kannst du stattdessen ein unendlich langes exponentielles Fenster verwenden, mit dem du die Ausgabe nur aus der Vergangenheit und dem aktuellen Eingang berechnen kannst. Aber das ist kein Standard-ungewichteten gleitenden Durchschnitt, aber ein exponentiell gewichteter gleitender Durchschnitt, wo die Proben in der Vergangenheit ein geringeres Gewicht bekommen, aber zumindest in der Theorie vergisst man nichts, was die Gewichte nur kleiner und kleiner für Proben weit in der Vergangenheit. Ich habe einen gleitenden Durchschnitt Ohne Einzelposten-Speicher für ein GPS-Tracking-Programm Ich schrieb. Ich beginne mit 1 Probe und teilen durch 1, um die aktuelle avg. I dann fügen Sie anothe Probe und teilen durch 2 auf die aktuelle avg. Dies geht weiter, bis ich auf die Länge zu bekommen Der Durchschnitt. Jede Zeit danach, füge ich in die neue Probe, bekomm den Durchschnitt und entferne diesen Durchschnitt aus der total. Ich bin kein Mathematiker, aber das schien wie ein guter Weg, es zu tun Ich dachte, es würde den Magen eines Echte Mathe Kerl aber, es stellt sich heraus, es ist eine der akzeptierten Möglichkeiten, es zu tun Und es funktioniert gut Nur daran erinnern, dass je höher Ihre Länge Je langsamer es folgt, was Sie folgen wollen Das mag nicht die meiste Zeit, aber wenn folgt Satelliten, wenn du langsam bist, könnte der Weg weit von der tatsächlichen Position entfernt sein und es wird schlecht aussehen Du könntest eine Lücke zwischen dem Sat und den hinteren Punkten haben Ich wählte eine Länge von 15 aktualisiert 6 mal pro Minute, um eine ausreichende Glättung zu bekommen und nicht Zu weit von der tatsächlichen Sat-Position mit dem geglätteten Pfad dots. answered 16. November 16 um 23 03.initialize total 0, zählen 0 jedes Mal sehen einen neuen value. Then eine Eingabe scanf, eine addieren total newValue, eine Inkrementzählung, eins Dividieren Sie die durchschnittliche Gesamtzahl. Dies wäre ein gleitender Durchschnitt über alle Inputs. Um den Durchschnitt über nur die letzten 4 Eingänge zu berechnen, würde es 4 Eingabevariablen erfordern, vielleicht kopiert jeder Eingang in eine ältere Eingabevariable und berechnet dann den neuen gleitenden Durchschnitt als Summe der 4 inputvariables, geteilt durch 4 rechte Verschiebung 2 wäre gut, wenn alle Eingänge waren positiv, um die durchschnittliche Berechnung. answered 3. Februar 15 um 4 06.That wird tatsächlich berechnen den Gesamtdurchschnitt und nicht der gleitende Durchschnitt Als Zählimpuls wird größer die Auswirkungen Von jeder neuen Eingabe Probe wird verschwindend klein Hilmar 3. Februar 15 um 13 53. Ihre Antwort.2017 Stack Exchange, Inc.

Comments