Thursday, 19 January 2017

Gleitender Durchschnittsoperator

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 Tony D Jun 8 14 at 14: 27AVG (Transact-SQL) ALL Wendet die Aggregatfunktion auf alle Werte an. ALL ist die Voreinstellung. DISTINCT Gibt an, dass AVG nur auf jeder eindeutigen Instanz eines Werts ausgeführt wird, unabhängig davon, wie oft der Wert auftritt. Expression Ein Ausdruck der exakten numerischen oder approximativen numerischen Datentyp-Kategorie mit Ausnahme des Bitdatentyps. Aggregatfunktionen und Unterabfragen sind nicht zulässig. OVER (partitionbyclaususe orderbyclause) partitionbyclause teilt die von der FROM-Klausel erzeugte Ergebnismenge in Partitionen, auf die die Funktion angewendet wird. Wenn nicht angegeben, behandelt die Funktion alle Zeilen der Abfrageergebnismenge als einzelne Gruppe. Orderbyclause bestimmt die logische Reihenfolge, in der die Operation ausgeführt wird. Eine Nachbestellung ist erforderlich. Weitere Informationen finden Sie unter OVER-Klausel (Transact-SQL). Der Rückgabetyp wird durch den Typ des ausgewerteten Ergebnisses des Ausdrucks bestimmt. Dezimal-Klasse (p, s) Ist der Datentyp des Ausdrucks ein Alias-Datentyp, so ist auch der Rückgabetyp vom Alias-Datentyp. Wenn jedoch der Basisdatentyp des Alias-Datentyps gefördert wird, beispielsweise von tinyint nach int. Ist der Rückgabewert vom geförderten Datentyp und nicht vom Alias-Datentyp. AVG () berechnet den Durchschnitt eines Wertsatzes, indem er die Summe dieser Werte durch die Anzahl der Nichtnullwerte dividiert. Wenn die Summe den Maximalwert für den Datentyp des Rückgabewertes überschreitet, wird ein Fehler zurückgegeben. AVG ist eine deterministische Funktion, wenn sie ohne die OVER - und ORDER BY-Klauseln verwendet wird. Sie ist nicht deterministisch, wenn sie mit den OVER - und ORDER BY-Klauseln angegeben ist. Weitere Informationen finden Sie unter Deterministische und nicht-deterministische Funktionen. A. Verwenden der SUM - und AVG-Funktionen für Berechnungen Das folgende Beispiel berechnet die durchschnittlichen Urlaubszeiten und die Summe der Krankenstunden, die die Vizepräsidenten von Adventure Works Cycles verwendet haben. Jede dieser Aggregatfunktionen erzeugt einen einzigen Summenwert für alle abgerufenen Zeilen. Das Beispiel verwendet die AdventureWorks2012-Datenbank. Ich habe einige CSTL-Code zu korrigieren. Leider habe ich sehr wenig C Erfahrung und weiß nichts über STL. Trotzdem beendete ich das meiste, aber die Funktion unten gibt mir immer noch Probleme: Sein höchstwahrscheinlich bedeutete, den durchschnittlichen Wert von einer Liste zu berechnen, aber es stimmt mit vielen Fehlern überein. Ich versuchte, nach einer Lösung im Web zu suchen, aber ich konnte nichts finden. Ich wäre froh, wenn mir jemand helfen könnte. Update: Vielen Dank für Ihre schnellen Antworten. Die akzeptierte Antwort löste alle meine Probleme. Sie geben nichts zurück. (Add return avg) Der - gt-Operator ist für Zeiger auf Objekte. Sie haben einen Verweis auf eine Liste, also verwenden Sie list. begin () und nicht list-gtbegin () (das gleiche für andere Member-Funktionen) Der Iterator sollte ein Constiterator sein. Nicht Iterator. Auf jeden Fall sollten Sie folgendes tun: return std :: akkumulieren (list. begin (), list. end (), 0.0) list. size () Optional checking für list. size () 0 falls das möglich ist Ihre Anwendungsfälle. Antwort # 2 am: April 12, 2010, 10:39:49 am »für std :: akkumulieren, denken Sie daran, dass list. size () wird über die Liste iterate, so dass Sie don39t wollen, nennen Sie es zweimal ndash jk. Die Größe () ist eine konstante Zeit Betrieb auf einige Compiler, und ist erforderlich, um so in C0x werden. Ndash jalf Ich bin nicht sicher, warum ich anstelle von Mai setzen, aber ja, für die heutige Standard-Größe ist nur erforderlich, O (n) ndash jk werden. Ja, es wäre ein konstanter Faktor von 2, wenn Sie es zweimal genannt haben und es war wirklich O (n), so wäre es immer noch O (n) insgesamt, seine immer noch wert denken, obwohl wie die Menschen oft davon ausgehen Größe ist immer O (1) ndash jk. Es ist viel besser, den Code als einen generischen Algorithmus mit dem Iterator-Typ als Vorlage-Parameter zu schreiben, anstatt zu bearbeiten, um sicherzustellen, dass Ihre Iteratoren auf Listen des gleichen Typs verweisen. Id auch beachten, dass für std :: Liste. Sowohl den ursprünglichen Code und die meisten der gebuchten Antworten haben ein ziemlich ernstes Effizienzproblem: Bei einer typischen Implementierung der Liste, iterieren sie durch die Liste einmal, um die Werte zusammenzufassen, und dann wieder tun, um die Anzahl der Elemente zu zählen. In der Theorie könnte list. size () in konstanter Zeit ohne Iteration durch die Elemente laufen, aber in Wirklichkeit ist das selten der Fall (Sie können konstante Komplexität für list :: size () oder list :: splice haben, aber nicht für beide einmal). Id schreiben den Code so etwas wie: Dies ist generisch, so dass es weiter zu arbeiten (unverändert), wenn Sie erkennen, dass std :: Liste war eine schlechte Wahl, und youd wirklich besser mit std :: vector. Ebenso, wenn Sie das arithmetische Mittel von einigen Ints anstelle von Doubles wünschen, kann es das ebenso behandeln (wieder, ohne den Code zu ändern). Drittens, auch wenn (wie oben angedeutet) Ihre Bibliotheken Implementierung von st :: list :: size () zufällig linear ist, wird es immer nur die Liste durchlaufen, so dass es wahrscheinlich etwa doppelt so schnell wie (eine funktionierende Version von ) Der ursprüngliche Code. Natürlich, Caching kann (wird) beeinflussen, dass - wenn Sie eine kleine Liste Durchschnitt, wird die erste Durchquerung die gesamte Liste in den Cache zu ziehen, so dass die zweite Durchquerung wird in der Regel viel schneller (so eliminiert, dass die zweite Durchquerung nicht speichern als viel Zeit). Antwortete am 1. Februar um 16:04 Dies wird nicht wie erwartet funktionieren. Zum Beispiel für vectorltintgt Rückgabetyp ist int, aber durchschnittlich ist vom Typ double, Ergebnis wird abgeschnitten ndash notsurewhyitisso Ja, können Sie es für vectorltintgt. Aber jede weitere I39d wahrscheinlich verwenden std :: akkumulieren (v. begin (), v. end (), 0.0) 47 v. size () ndash Jerry Coffin Feb 15 14 at 18:17 Da Liste ist eher eine Referenz als ein Zeiger , Brauchen Sie nicht die - Dereferenzoperator, sondern nur die. Operator, d. h. es list. begin () und so weiter. Darüber hinaus, wie alle anderen hat darauf hingewiesen, die Schablonentyp-Parameter für Liste und ihre Iterator müssen alle übereinstimmen: entweder ltintgt oder ltdoublegt. Es sieht aus wie die Funktion wurde ursprünglich geschrieben, um eine Liste von double s zu akzeptieren.


No comments:

Post a Comment