Tuesday 21 November 2017

Einfach Gleitender Durchschnitt Code In C


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 kann, indem Sie eine Fenstergröße, die eine Macht von zwei für Bit-Verschiebung statt zu teilen, aber nicht brauchen zu ermöglichen Ein 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 zu beantworten Februar 3 15 bei 4:06 Das wird tatsächlich berechnen den Gesamtdurchschnitt und nicht den gleitenden Durchschnitt. Wie Zähler wird größer wird der Einfluss eines neuen Eingangsbeispiel verschwindend kleiner ndash Hilmar Feb Ich habe gegoogelt und keine passende oder lesbare Beispiele gefunden. Im Grunde möchte ich, um die Spur zu verfolgen Gleitenden Durchschnitt eines laufenden Stroms eines Gleitkommazahlstroms unter Verwendung der letzten 1000 Zahlen als Datenabtastwert. 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, die als addiert hinzugefügt wurden, aktualisiert 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 Tony D 8. Juni 14 um 14: 27I haben eine 4000 Menge Daten von Lager und Tring den gleitenden Durchschnitt für alle Datenwerte zu berechnen, aber da der gleitende Durchschnitt auf früheren Daten basiert, und ich kann die 15-Tage-SMA nicht berechnen Die ersten 14 Tage, überspringen die ersten 14 Tage und berechnen die SMA auf den Rest der Daten. Und es ist zu LINQ verwenden, um zu erreichen. Kann jemand eine Probe geben oder Hinweis, wie man mit LINQ zu berechnen gleitenden Durchschnitt Die Ausgabe für die durchschnittlichen Werte sind alle um 500s Ich wirklich nicht verstehen, wie ist, dass möglich, dass hohe Wert zu bekommen. Verschieben Mittelwertbildner mit Summen-Array: 06072012 562,49 571,72 06082012 565,84 580,32 06112012 568,56 571,17 06122012 569,55 576,16 06132012 570,56 572,16 06142012 570,63 571,53 06152012 571,21 574,13 06182012 572,78 585,78 06192012 573,79 587,41 06202012 574,23 585,74 06212012 574,22 577,67 06222012 575,63 582,10 06252012 576,06 570,77 06262012 576,68 572,03 06272012 576,88 574,50 06.282.012 576,7 569,05 06.292.012 576,95 584,00 578,37 592,52 07.022.012 07.032.012 579,92 599,41 581,74 599,41 07.032.012 Herausgegeben von Leemx Freitag, 16. November 2012 02.59 Gerührt von Lisa Zhu Microsoft Kontingent Personal Montag, 19. November 2012 07.38 Linq (von : Visual C Allgemein) Freitag, 16. 2012 02.42 November einen gleitenden Durchschnitt zu erstellen, ich durch die Schaffung eines Bereichs von 0 bis (Länge der Datenliste beginnen würde - Länge bewegter Zeit), dann für jeden Wert im Bereich Elemente x bis x 43 Länge der Bewegungsperiode auswählen und den Mittelwert berechnen. in einer schönen LINQ-Anweisung All: Beachten Sie, dass dies nicht sehr effizient ist, da man im Grunde über die Datenliste iterieren für jeden Wert im Bereich .. Hey, schauen Dieses System ermöglicht Unterschriften von mehr als 60 cha Herausgegeben von Arno Brouwer Freitag November 23, 2012 4:42 PM Als Antwort markiert von Alexander Sun Friday, December 07, 2012 4:41 PM Alle Antworten Eine Probe Ihrer LINQ-Anweisung würde helfen. quotPremature Optimierung ist die Wurzel allen evil. quot - Knuth einen gleitenden Durchschnitt zu erstellen, würde ich beginnen mit einem Bereich von 0 bis zu schaffen (Länge der Datenliste - Länge bewegter Zeit), dann für jeden Wert im Bereich von Auswahlelementen x Bis x 43 Länge der Bewegungsperiode und berechnen den Durchschnitt. Alle in einem schönen LINQ-Anweisung: Beachten Sie, dass dies nicht sehr effizient ist, da Sie im Grunde iterieren über die Datenliste für jeden Wert im Bereich .. Hey, Look Dieses System ermöglicht Signaturen von mehr als 60 cha Editiert von Arno Brouwer Freitag, November 23, 2012 4:42 PM Als Antwort markiert von Alexander Sun Freitag, den 07. Dezember 2012 um 04:41 Uhr Microsoft führt eine Online-Umfrage durch, um Ihre Meinung über die Msdn-Website zu verstehen. Wenn Sie sich für eine Teilnahme entscheiden, wird Ihnen die Online-Umfrage präsentiert, wenn Sie die Msdn-Website verlassen. Möchten Sie teilnehmen Helfen Sie uns, MSDN zu verbessern. Besuchen Sie unsere UserVoice Seite, um auf Ideen Dev Centers Lernressourcen vorzulegen und abzustimmen

No comments:

Post a Comment