Monday 6 November 2017

Gleitende Durchschnittliche Algorithmusimplementierung


Wenn Leistung dieses Codes kritisch ist, dann könnte es sinnvoll sein, Heapzuweisungen für Kerzen zu vermeiden. Ich denke, die vernünftigste Art, dies zu tun, wäre, Candle zu einer Struktur zu machen. Obwohl veränderliche Werttypen sind böse. So würde ich auch Refactor Kerze unveränderlich sein. Dies bedeutet auch, dass sich die Implementierung von newestCandle ändern müsste, wahrscheinlich in ein Paar von Doppelfeldern (oder alternativ eine separate veränderliche und rücksetzbare Klasse). Ich sehe keine andere potenzielle Leistungsproblem in Ihrem Code. Aber wenn es um Leistung geht, sollten Sie immer auf Profiling, nicht Ihre (oder jemand elses) Intuition verlassen. Auch ich mag nicht einige Namen Ihrer Methoden. Speziell: ValueUpdated. Methodennamen sollten in der Regel in der Form etwas tun, nicht etwas passiert. Also ich denke, ein besserer Name wäre UpdateValue. Hinzufügen. Ändern. Dies sind die beiden grundlegenden Operationen Ihres MovingAverage und ich denke, dass diese Namen nicht ausdrücken die Bedeutung gut. Ich würde sie so etwas wie MoveAndSetCurrent und SetCurrent nennen. beziehungsweise. Obwohl diese Benennung bedeutet, dass die grundlegenden Operationen eher Move und SetCurrent sein sollten. Moving Average als Filter Der gleitende Durchschnitt wird oft für die Glättung von Daten in Anwesenheit von Rauschen verwendet. Der einfache gleitende Durchschnitt wird nicht immer als der Finite Impulse Response (FIR) - Filter erkannt, der es ist, während er tatsächlich einer der gebräuchlichsten Filter in der Signalverarbeitung ist. Wenn man sie als Filter betrachtet, kann man sie beispielsweise mit gefensterten Filtern vergleichen (siehe Artikel zu Tiefpaß-, Hochpass - und Bandpass - und Bandsperrfiltern für Beispiele). Der Hauptunterschied zu diesen Filtern besteht darin, daß der gleitende Durchschnitt für Signale geeignet ist, für die die Nutzinformation im Zeitbereich enthalten ist. Von denen Glättungsmessungen durch Mittelung ein Paradebeispiel sind. Window-sinc-Filter, auf der anderen Seite, sind starke Künstler im Frequenzbereich. Mit Ausgleich in der Audioverarbeitung als typisches Beispiel. Es gibt einen detaillierteren Vergleich beider Arten von Filtern in Time Domain vs. Frequency Domain Performance von Filtern. Wenn Sie Daten haben, für die sowohl die Zeit als auch die Frequenzdomäne wichtig sind, dann möchten Sie vielleicht einen Blick auf Variationen auf den Moving Average werfen. Die eine Anzahl gewichteter Versionen des gleitenden Durchschnitts zeigt, die besser sind. Der gleitende Durchschnitt der Länge (N) kann so definiert werden, wie er üblicherweise implementiert ist, wobei der aktuelle Ausgabeabtastwert der Durchschnitt der vorhergehenden (N) Abtastwerte ist. Als Filter betrachtet, führt der gleitende Durchschnitt eine Faltung der Eingangsfolge (xn) mit einem rechteckigen Puls der Länge (N) und der Höhe (1N) durch (um den Bereich des Pulses und damit die Verstärkung des Filters zu erzeugen , eins ). In der Praxis ist es am besten, (N) ungerade zu nehmen. Obwohl ein gleitender Durchschnitt auch unter Verwendung einer geraden Anzahl von Abtastwerten berechnet werden kann, hat die Verwendung eines ungeradzahligen Wertes für (N) den Vorteil, daß die Verzögerung des Filters eine ganzzahlige Anzahl von Abtastwerten ist, da die Verzögerung eines Filters mit (N) Proben genau ((N-1) 2). Der gleitende Durchschnitt kann dann exakt mit den ursprünglichen Daten ausgerichtet werden, indem er um eine ganze Zahl von Abtastwerten verschoben wird. Zeitdomäne Da der gleitende Durchschnitt eine Faltung mit einem rechteckigen Puls ist, ist sein Frequenzgang eine sinc-Funktion. Dies macht es ähnlich dem Dual des Fenstersynchronfilters, da es sich hierbei um eine Faltung mit einem Sinc-Puls handelt, der zu einem rechteckigen Frequenzgang führt. Es ist diese sinc Frequenzantwort, die den gleitenden Durchschnitt ein schlechter Darsteller im Frequenzbereich macht. Allerdings führt es sehr gut im Zeitbereich. Daher ist es perfekt, um Daten zu löschen, um Rauschen zu entfernen, während gleichzeitig eine schnelle Sprungantwort beibehalten wird (1). Für das typische Additiv-Weiß-Gauß-Rauschen (AWGN), das oft angenommen wird, hat die Mittelung (N) - Proben den Effekt, das SNR um einen Faktor von (sqrt N) zu erhöhen. Da das Rauschen für die einzelnen Proben unkorreliert ist, gibt es keinen Grund, jede Probe unterschiedlich zu behandeln. Daher wird der gleitende Durchschnitt, der jeder Probe das gleiche Gewicht gibt, die maximale Menge an Rauschen für eine gegebene Sprungantwortschärfe beseitigen. Implementierung Da es sich um ein FIR-Filter handelt, kann der gleitende Durchschnitt durch Faltung implementiert werden. Es hat dann die gleiche Effizienz (oder das Fehlen davon) wie jedes andere FIR-Filter. Sie kann aber auch rekursiv und effizient umgesetzt werden. Es folgt unmittelbar aus der Definition, daß diese Formel das Ergebnis der Ausdrücke für (yn) und (yn1) ist, dh, daß die Veränderung zwischen (yn1) und (yn) ein zusätzlicher Term (xn1N) ist Das Ende, während der Term (xn-N1N) von Anfang entfernt wird. In praktischen Anwendungen ist es oft möglich, die Division durch (N) für jeden Term auszulassen, indem die resultierende Verstärkung von (N) an einer anderen Stelle kompensiert wird. Diese rekursive Umsetzung wird viel schneller als Faltung. Jeder neue Wert von (y) kann mit nur zwei Additionen anstelle der (N) Additionen berechnet werden, die für eine einfache Implementierung der Definition erforderlich wären. Eine Sache, mit der Sie nach einer rekursiven Implementierung Ausschau halten, ist, dass Rundungsfehler akkumulieren. Dies kann ein Problem für Ihre Anwendung sein oder auch nicht, aber es bedeutet auch, dass diese rekursive Implementierung tatsächlich mit einer Integer-Implementierung besser funktionieren wird als mit Gleitkommazahlen. Dies ist sehr ungewöhnlich, da eine Gleitkomma-Implementierung gewöhnlich einfacher ist. Der Schluss davon muss sein, dass Sie die Nützlichkeit des einfachen gleitenden Durchschnittsfilters in Signalverarbeitungsanwendungen nie unterschätzen sollten. Filter Design Tool Dieser Artikel wird mit einem Filter Design Tool ergänzt. Experimentiere mit verschiedenen Werten für (N) und visualisiere die resultierenden Filter. Versuchen Sie es jetztIch muss den Überblick über die letzten 7 Tage Arbeitsstunden in einer Flat-File-Leseschleife zu halten. Seine verwendet werden, um die Ermüdbarkeit von Arbeitsplänen zu messen. Im Moment habe ich etwas, das funktioniert, aber es scheint ziemlich ausführlich und Im nicht sicher, ob theres ein Muster, das mehr prägnant ist. Derzeit habe ich eine Java-Klasse mit einem statischen Array, um die letzten x-Tage-Daten halten, dann, wie ich durch die Datei zu lesen, hacke ich das erste Element und verschieben die anderen 6 (für eine Woche rollen insgesamt) zurück um eins. Die Verarbeitung dieses statischen Arrays erfolgt in seinem eigenen Verfahren, dh. Meine Frage: ist dies eine vernünftige Design-Ansatz, oder gibt es etwas blendend offensichtlich und einfach, diese Aufgabe zu tun Danke Jungs gefragt Aug 30 11 at 14:33 Vielen Dank Jungs: I39ve bekam die Nachricht: Verwenden Sie ein übergeordnetes Objekt und nutzen die Relevante Methoden oder einen Ringpuffer. Große Antworten, alle von ihnen. Wenn Sie darüber nachdenken, benötigen Sie immer Zugriff auf das gesamte Array, so können Sie loswerden, dass erste Eintrag - die ich war nicht sicher, auf eigene Faust. I39m erleichtert, dass ich hadn39t verpasste einige 1 Liner und war im Grunde auf eine vernünftige, wenn nicht effizient und knapp Track Dies ist, was ich liebe über diese Website: qualitativ hochwertige, relevante Antworten von Menschen, die ihre sht kennen. Ndash Pete855217 Aug 11, 2010, um 15:05 Uhr Warum initialisieren Sie runningTotal auf null Was ist der Typ, wo es deklariert Es wäre gut, wenn Sie einige Code-Beispiele, die tatsächlichen Java-Code ähneln setzen. Im Übrigen wäre meine Kritik die folgende: Ihre Funktion hat zu viel. Eine Funktion oder Methode sollte zusammenhängend sein. Entsprechend sollten sie eine Sache und eins nur tun. Schlimmer noch, was passiert in Ihrer for-Schleife, wenn x 5 Sie kopieren runningTotal6 in runningTotal5. Aber dann haben Sie zwei Kopien des gleichen Wertes an Position 5 und 6. In Ihrem Design, Ihre Funktion movesshuffles die Elemente in Ihrem Array berechnet die Gesamtausdruck Zeug auf Standard-Fehler liefert die Summe Es tut zu viel. Mein erster Vorschlag ist nicht zu bewegen Zeug um in der Array. Stattdessen implementieren Sie einen kreisförmigen Puffer und verwenden Sie es statt des Arrays. Es vereinfacht Ihren Entwurf. Mein zweiter Vorschlag ist, Dinge in Funktionen zusammenzufassen, die zusammenhängen: haben Sie eine Datenstruktur (ein kreisförmiger Puffer), der Ihnen erlaubt, es hinzuzufügen (und das den ältesten Eintrag sinkt, wenn es seine Kapazität erreicht hat) Interator haben eine Funktion, die die Summe auf dem Iterator berechnet (Sie dont care, wenn Sie die Summe aus einem Array, Liste oder kreisförmigen bufer.) Dont nennen es insgesamt. Nennen Sie es Summe, die ist, was Sie berechnen. Das ist, was Id tun :) That39s große info luis, aber denken Sie daran, diese Funktion ist ein kleiner Teil der Funktionalität der Klasse, und es wäre Overkill zu viel Code hinzufügen, um es perfekt. Sie sind technisch korrekt, und ich verstehe, dass mein Code zu viel 39 macht, aber gleichzeitig ist es manchmal besser, auf der Seite des kleineren, klareren Codes zu irren als für Perfektion zu gehen. Angesichts meiner Java-Fähigkeiten, auch die Herstellung der Pseudocode Sie beschreiben kompilieren würde ich blasen mein Budget auf diese (), aber danke für die klare Beschreibung. Ndash Pete855217 Aug 31 11 at 2:23 Hmmm, es geht nicht um Perfektion, sondern um etablierte industrielle Praktiken, die wir seit den letzten 3 Jahrzehnten kennen. Sauberer Code ist immer einer, der partitioniert ist. Wir haben jahrzehntelange Evidenz, die zeigen, dass dies der Weg ist, um in den allgemeinen Fall zu gehen (in Bezug auf Kosteneffizienz, Defektverkleinerung, Verständnis usw.). Es sei denn, es ist Wegwerf-Code für eine einmalige Art der Sache. Es ist niemals teuer, dies zu tun, wenn man auf diese Weise eine Problemanalyse startet. Codierung 101, brechen das Problem und der Code folgt, weder Overkill noch schwierig) ndash luis. espinal Ihre Aufgabe ist zu einfach und die Vorgehensweise Sie angenommen haben, ist sicherlich gut für den Job. Allerdings, wenn Sie ein besseres Design verwenden möchten, müssen Sie loszuwerden, dass alle die Anzahl der Bewegung Sie besser eine FIFO-Warteschlange und machen gute Verwendung von Push-und Pop-Methoden, die Art und Weise der Code reflektiert keine Datenbewegung, nur die beiden logischen Aktionen Von neuen Daten und entfernen Sie Daten, die älter als 7 Tage sind. Beantwortet Aug 30 11 at 14:49

No comments:

Post a Comment