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). Initialize total 0, count0 (jedes Mal, wenn ein neuer Wert angezeigt wird) Dann ein Eingang (scanf), ein add totalnewValue, ein Inkrement (count), ein Divide-Durchschnitt (total / count) Dies wäre ein gleitender Durchschnitt über alle Eingänge Als nur die letzten 4 Eingänge, würde 4 Inputvariablen, vielleicht kopieren Sie jeden Eingang zu einer älteren inputvariable, dann die Berechnung der neuen gleitenden Durchschnitt als Summe der 4 Inputvariablen, geteilt durch 4 (rechte Verschiebung 2 wäre gut, wenn alle Eingänge waren Positiv, um die durchschnittliche KalkulationIm-Kodierung etwas in dem Augenblick, wo Im eine Reihe von Werten im Laufe der Zeit aus einem Hardware-Kompass. Dieser Kompass ist sehr genau und Updates sehr oft, mit dem Ergebnis, dass, wenn es leicht wackelt, ich am Ende mit dem ungeraden Das ist sehr widersprüchlich mit seinen Nachbarn. Ich möchte, um diese Werte aus. Haben einige Lesung um, es scheint, dass, was ich will, ist ein Hochpassfilter, ein Tiefpassfilter oder einen gleitenden Durchschnitt Gehen Sie mit, halten Sie einfach eine Geschichte der letzten 5 Werte oder was auch immer, und verwenden Sie den Durchschnitt dieser Werte stromabwärts in meinem Code, wo ich war einmal nur mit dem jüngsten Wert. Das sollte, glaube ich, die Wackeln schön abschneiden, aber es schlägt mir, dass seine wahrscheinlich ziemlich ineffizient, und dies ist wahrscheinlich eines dieser bekannten Probleme zu Proper Programmers, denen theres eine wirklich ordentliche Clever Math-Lösung. Ich bin jedoch einer jener schrecklichen selbstprogrammierten Programmierer ohne einen Fetzen der formalen Bildung in irgendetwas sogar vage mit CompSci oder Mathe verwandt. Lesen um ein Bit deutet darauf hin, dass dies ein Hoch-oder Tiefpassfilter sein kann, aber ich kann nicht finden, was in Begriffen verständlich für einen Hack wie ich, was die Wirkung dieser Algorithmen wäre auf einer Reihe von Werten, geschweige denn wie die Mathematik Arbeitet. Die Antwort hier. Zum Beispiel, technisch beantwortet meine Frage, aber nur verständlich für diejenigen, die wahrscheinlich schon wissen, wie das Problem zu lösen. Es wäre ein sehr schöner und kluger Mensch, der die Art des Problems erklären könnte, und das, wie die Lösungen funktionieren, in Begriffen, die einem Kunstabsolventen verständlich sind. Wenn Ihr gleitender Durchschnitt muss lang sein, um die gewünschte Glättung zu erreichen, und Sie brauchen nicht wirklich eine bestimmte Form des Kernels, dann sind Sie besser dran, wenn Sie einen exponentiell verfallenden gleitenden Durchschnitt verwenden: wo Sie Wählen Sie winzig, um eine passende Konstante zu sein (zB, wenn Sie winzige 1- 1 / N wählen, wird es die gleiche Menge der Mittelung wie ein Fenster der Größe N haben, aber verteilt unterschiedlich über ältere Punkte). Wie auch immer, da der nächste Wert des gleitenden Durchschnitts hängt nur von der vorherigen und Ihre Daten, müssen Sie nicht eine Warteschlange oder etwas zu halten. Und Sie können denken, dies zu tun, so etwas wie: Nun, ich habe einen neuen Punkt, aber ich dont wirklich vertrauen es, so Im werde 80 meiner alten Schätzung der Messung zu halten, und nur vertrauen diesem neuen Datenpunkt 20. Das ist So ziemlich das gleiche wie zu sagen, Nun, ich vertraue nur diesem neuen Punkt 20, und ich benutze 4 andere Punkte, die ich vertrauen die gleiche Menge, außer dass anstatt explizit nehmen die 4 anderen Punkten, youre unter der Annahme, dass die Mittelung haben Sie das letzte Mal War vernünftig, so können Sie Ihre vorherige Arbeit. Beantwortet Sep 21 10 at 14:27 Hey, ich weiß, das ist 5 Jahre zu spät, aber danke für eine großartige Antwort. I39m arbeitet an einem Spiel, bei dem der Klang sich nach Ihrer Geschwindigkeit ändert, aber wegen des Laufenlassens des Spiels auf einem langsam-ass Computer, würde die Geschwindigkeit wild schwanken, was für die Lenkung gut war, aber super ärgerlich in Bezug auf Sound. Dies war eine wirklich einfache und billige Lösung für etwas, das ich für ein wirklich komplexes Problem halten würde. Ndash Wenn Sie versuchen, den gelegentlichen ungeraden Wert zu entfernen, ist ein Tiefpassfilter die beste der drei Optionen, die Sie identifiziert haben. Tiefpaßfilter erlauben langsame Änderungen, wie die, die durch das Drehen eines Kompasses von Hand verursacht werden, während Abweisen von Hochgeschwindigkeitsänderungen, wie z. B. durch Stöße auf der Straße, verursacht werden. Ein gleitender Durchschnitt wird wahrscheinlich nicht ausreichen, da die Auswirkungen eines einzelnen Blips in Ihren Daten auf mehrere nachfolgende Werte wirken, abhängig von der Größe des gleitenden Durchschnittsfensters. Wenn die ungeraden Werte leicht erkannt werden, können Sie sogar mit einem Glitch-Entfer - nal-Algorithmus besser abschneiden, der sie komplett ignoriert: Hier ist ein Guick-Graphen zu veranschaulichen: Der erste Graphen ist das Eingangssignal mit einem unangenehmen Glitch. Die zweite Grafik zeigt die Wirkung eines 10-stelligen Gleitmittels. Der endgültige Graph ist eine Kombination aus dem 10-Sample-Mittelwert und dem einfachen Glitch-Detektionsalgorithmus, der oben gezeigt ist. Wenn der Glitch detektiert wird, wird anstelle des tatsächlichen Wertes der 10-Sample-Mittelwert verwendet. Beantwortet Sep 21 10 am 13:38 Schön erklärt und Bonuspunkte für die Grafik) ndash Henry Cooke Sep 22 10 at 0:50 Wow. Seldomly sah so eine schöne Antwort ndash Muis Jun 4 13 at 9:14 Der gleitende Durchschnitt ist ein Tiefpassfilter. Ndash nomen Okt 21 13 am 19:36 Versuchen Sie einen laufenden / Streaming-Median statt. Ndash kert Apr 25 14 am 22:09 Gleitender Durchschnitt kann ich unten erhalten. Aber es scheint mir, dass seine wahrscheinlich ziemlich ineffizient. Theres wirklich kein Grund ein gleitender Durchschnitt sollte ineffizient sein. Sie halten die Anzahl der Datenpunkte, die Sie in einem Puffer (wie eine zirkuläre Warteschlange) wollen. An jedem neuen Datenpunkt pflücken Sie den ältesten Wert und subtrahieren ihn von einer Summe, und drücken Sie den neuesten und fügen Sie ihn der Summe hinzu. Jeder neue Datenpunkt beinhaltet also nur einen Pop / Push, eine Addition und eine Subtraktion. Ihr gleitender Durchschnitt ist immer diese Verschiebungssumme geteilt durch die Anzahl der Werte in Ihrem Puffer. Es wird ein wenig trickiger, wenn youre Empfangen von Daten gleichzeitig von mehreren Threads, aber da Ihre Daten von einem Hardware-Gerät kommt, das scheint sehr zweifelhaft für mich. Oh und auch: schreckliche Selbst-gelehrte Programmierer vereinen) Der gleitende Durchschnitt schien mir ineffizient, weil Sie einen Puffer von Werten speichern müssen - besser, nur einige Clever Maths mit Ihrem Eingabewert und aktuellen Arbeitswert zu tun Ich denke, dass ist wie exponentiell gleitenden Durchschnitt Arbeitet. Eine Optimierung, die ich für diese Art von gleitendem Durchschnitt gesehen habe, beinhaltet die Verwendung eines Fixlängen-Warteschlangen-Amps, einen Zeiger auf, wo Sie sich in dieser Warteschlange befinden, und einfach den Zeiger um (mit oder einem If) wickeln. Voila Kein teurer Push / Pop. Power für die Amateure, Bruder ndash Henry Cooke Henry: Für einen geraden-gleitenden Durchschnitt brauchst du den Puffer einfach so, dass du weißt, welcher Wert geknallt wird, wenn der nächste Wert gedrückt wird. Das heißt, die quotfixed-Länge Warteschlange amp eine pointerquot Sie beschreiben ist genau das, was ich durch quotcircular queue. quot Bedeutet, warum ich sage, es ist nicht ineffizient. Was meinst du, ich meinte, Und wenn Ihre Antwort ist quotan Array, das seine Werte zurück verschiebt sich auf jedem indexierten removalquot (wie std :: vector in C). Also, I39m so weh I don39t sogar wollen, um mit Ihnen zu sprechen) ndash Dan Tao 22 September at 1:58 Henry: Ich don39t wissen über AS3, aber ein Java-Programmierer hat Sammlungen wie CircularQueue zu seiner Verfügung (I39m Nicht ein Java-Entwickler, so I39m sicher, es gibt bessere Beispiele da draußen that39s genau das, was ich aus einer schnellen Google-Suche gefunden), die genau die Funktionalität implementiert, über die wir reden. I39m ziemlich zuversichtlich, die Mehrheit der Mittel-und Low-Level-Sprachen mit Standard-Bibliotheken haben etwas ähnliches (z. B. in there39s QueueltTgt). Jedenfalls war ich selbst Philosophie. alles ist vergeben. Ndash Dan Tao Ein exponentiell abnehmender gleitender Durchschnitt kann von Hand mit nur dem Trend berechnet werden, wenn Sie die richtigen Werte verwenden. Siehe www. fourmilab. ch/hackdiet/e4/ für eine Idee, wie dies schnell mit einem Stift und Papier, wenn Sie für exponentiell geglättet gleitenden Durchschnitt mit 10 Glättung suchen. Aber da Sie einen Computer haben, möchten Sie wahrscheinlich binäre Verschiebung im Gegensatz zur Dezimalverschiebung tun) Auf diese Weise brauchen Sie nur eine Variable für Ihren aktuellen Wert und einen für den Durchschnitt. Daraus kann dann der nächste Mittelwert berechnet werden. Beantwortet eine Technik namens Bereichstor, die gut funktioniert mit Low-Vorkommen falschen Proben. Unter der Annahme einer der oben erwähnten Filtertechniken (gleitender Durchschnitt, exponentiell), sobald Sie über ausreichende Historie verfügen (eine Zeitkonstante), können Sie die neue, eingehende Datenprobe für die Angemessenheit testen, bevor sie zur Berechnung hinzugefügt wird. Ist ein gewisses Wissen über die maximale vernünftige Änderungsrate des Signals erforderlich. Wird die Rohprobe mit dem letzten geglätteten Wert verglichen, und wenn der absolute Wert dieser Differenz größer als der zulässige Bereich ist, wird diese Probe herausgeworfen (oder durch eine Heuristik ersetzt, zB eine Vorhersage basierend auf der Steigungsdifferenz oder dem Trend Vorhersagewert von doppelter exponentieller Glättung) antwortete am 30. April um 6: 56Ich weiß, dass dies mit Steigerung wie pro erreichbar ist: Aber ich möchte wirklich vermeiden, Boost zu verwenden. 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 Update / 1000000). 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 ergänzt / ersetzt wird, wodurch kostspielige O (N) - Transversionen vermieden werden, um die Summe zu berechnen, die für den durchschnittlichen Bedarf benötigt wird. 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 Jun 8 14 at 14: 27Intro Eine der Hauptanwendungen für das Arduino-Board ist das Lesen und Protokollieren von Sensordaten. Zum Beispiel überwacht man den Druck jede Sekunde des Tages. Da hohe Abtastraten oft Spikes in den Graphen erzeugen, möchte man auch einen Mittelwert der Messungen haben. Da die Messungen nicht statisch in der Zeit sind, was wir oft brauchen, ist ein laufender Durchschnitt. Dies ist der Durchschnitt einer bestimmten Periode und sehr wertvoll bei der Trendanalyse. Die einfachste Form eines laufenden Durchmessers kann durch einen Code ausgeführt werden, der auf dem vorherigen laufenden Durchschnitt basiert: Wenn man keine Gleitkomma-Mathematik verwenden möchte - da dies Speicherplatz einnimmt und Geschwindigkeit verringert - kann man dies in der Integer-Domäne vollständig durchführen. Die Teilung durch 256 in dem Beispielcode ist ein Schiebe-Recht 8, das schneller ist als eine Teilung durch z. B. 100. Dies gilt für jede Potenz von 2 als Teiler und man muss nur darauf achten, dass die Summe der Gewichte gleich der Potenz von 2 ist. Und natürlich sollte man darauf achten, dass es keinen Zwischenüberlauf gibt (erwägen Sie unsigned long) Eine genauere laufende Durchschnitt, in concreto aus den letzten 10 Messungen, benötigen Sie ein Array (oder verkettete Liste), um sie zu halten. Diese Anordnung wirkt wie ein kreisförmiger Puffer und bei jeder neuen Messung wird die älteste entfernt. Der laufende Durchschnitt wird als die Summe aller Elemente geteilt durch die Anzahl der Elemente in dem Array berechnet. Der Code für den laufenden Durchschnitt wird etwa so aussehen: Nachteil dieses Codes ist, dass das Array, um alle Werte zu halten, ziemlich groß werden kann. Wenn Sie eine Messung pro Sekunde haben und Sie wollen einen laufenden Durchschnitt pro Minute benötigen Sie ein Array von 60 ein durchschnittliches pro Stunde würde ein Array von 3600 benötigen. Das könnte nicht auf diese Weise auf einem Arduino getan werden, da es nur 2K RAM hat. Allerdings kann durch den Bau eines 2-stufigen Durchschnitts kann es ganz gut angegangen werden (Disclaimer: nicht für alle Messungen). Im psuedo-Code: Da für jede runningAverage-Funktion ein neues internes statisches Array benötigt wird, wird dieses als Klasse implementiert. RunningAverage-Bibliothek Die RunningAverage-Bibliothek bildet eine Klasse der oben genannten Funktion, so dass sie mehrfach in einer Skizze verwendet werden kann. Es entkoppelt die add () - und die avg () - Funktion, um ein wenig flexibler zu sein, z. B. Kann man den Durchschnitt mehrmals nennen, ohne eine Sache hinzuzufügen. Beachten Sie, dass jede Instanz der Klasse ein eigenes Array hinzufügt, um Messungen zu halten, und dass dies die Speicherauslastung addiert. Die Schnittstelle der Klasse wird so klein wie möglich gehalten. Anmerkung: Bei Version 0.2 werden die Namen der Methoden beschreibender. Verwendung Eine kleine Skizze zeigt, wie sie verwendet werden kann. Ein Zufallsgenerator wird verwendet, um einen Sensor nachzuahmen. In setup () wird der myRA gelöscht, so dass wir mit dem Hinzufügen neuer Daten beginnen können. In loop () wird zuerst eine Zufallszahl erzeugt und in einen float umgerechnet, der myRA hinzugefügt wird. Dann wird das runningAverage auf den seriellen Port gedruckt. Man könnte es auch auf einem LCD-Display oder über ethernet etc. Wenn 300 Elemente hinzugefügt myRA ist gelöscht, um neu zu beginnen. Hinweise Um die Bibliothek zu verwenden, müssen Sie einen Ordner in Ihrem SKETCHBOOKPATHlibaries mit dem Namen RunningAverage erstellen und dort die. h - und die. cpp-Datei ablegen. Fügen Sie optional ein Beispielunterverzeichnis hinzu, um die Beispielanwendung zu platzieren. Geschichte 2011-01-30: Anfangsversion 2011-02-28: fester fehlender Zerstörer in der. h Akte 2011-02-28: entfernter Standardkonstruktor 2012--. TrimValue () Yuval Naveh hinzugefügt trimValue (gefunden im Web) 2012-11-21: refactored 2012-12-30: hinzugefügt fillValue () refactored für die Veröffentlichung 2014-07-03: hinzugefügt Speicherschutz-Code - wenn internen Array nicht zugeordnet werden kann Größe Wird 0. Dies ist, um das hier beschriebene Problem zu lösen - forum. arduino. cc/indextopic50473.msg1790086msg1790086 - Todo Test ausführlich. Template-Klasse RunningAverage. h RunningAverage. cppAverages / Einfacher gleitender Durchschnitt Durchschnittswerte / Einfacher gleitender Durchschnitt Sie werden aufgefordert, diese Aufgabe entsprechend der Aufgabenbeschreibung zu lösen, indem Sie jede beliebige Sprache verwenden. Berechnen der einfachen gleitenden Durchschnitt einer Reihe von Zahlen. Erstellen Sie eine Stateful-Funktion / Klasse / Instanz, die einen Punkt dauert und gibt eine Routine zurück, 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 vom init-moving-average zurückgegebene Funktion hat ihren Zustand in einem Atom, das einen Queue-Wert enthält. 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 2ND / 1 gefunden werden, und Mittelwert kann in Liste / OPS 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 ist ebenfalls kleiner, der korrekte Wert (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) .) Summiert sie sum (.) / (Iz) ri wird sie mitteln und das Ergebnis an der entsprechenden Stelle in der Ergebnisliste speichern Verwenden eines Schließens und Erstellen einer Funktion
No comments:
Post a Comment