Ich habe im Wesentlichen ein Array von Werten wie folgt. Das oben genannte Array ist vereinfacht, ich sammle 1 Wert pro Millisekunde in meinem realen Code und ich muss die Ausgabe auf einem Algorithmus verarbeiten, den ich schrieb, um den nächstgelegenen Peak vor einem Zeitpunkt zu finden Logik scheitert, weil in meinem Beispiel oben, 0 36 ist die reale Spitze, aber mein Algorithmus würde nach hinten schauen und sehen die letzte Zahl 0 25 als die Spitze, da es eine Abnahme auf 0 24 vor it. The Ziel ist, diese Werte zu nehmen Und wendet einen Algorithmus an sie an, die sie ein bisschen glätten wird, damit ich mehr lineare Werte habe, dh ich mag meine Resultate, um curvy zu sein, nicht jaggedy. Ich wurde gesagt, um einen exponentiellen gleitenden durchschnittlichen Filter auf meine Werte anzuwenden Wie kann ich Tu es das ist es wirklich schwer für mich, mathematische Gleichungen zu lesen, ich befasse mich viel besser mit Code. Wie verarbeite ich Werte in meinem Array und wende eine exponentielle gleitende durchschnittliche Berechnung an, um sie auch auszumachen. 8. Februar um 20 27.Zur berechnen Ein exponentieller gleitender Durchschnitt musst du einen Zustand halten und du brauchst einen Tuning-Parameter. Dies verlangt eine kleine Klasse, die davon ausgeht, dass du Java 5 oder höher benutzt. Mit dem Zerfallsparameter, den du tun möchtest, soll das Tuning zwischen 0 und 1 und dann sein Verwenden Sie den Durchschnitt zu filtern. Wenn das Lesen einer Seite auf einige mathematische Wiederholung, alles, was Sie wirklich wissen müssen, wenn Sie es in Code ist, dass Mathematiker gerne Indizes in Arrays und Sequenzen mit Indizes schreiben Sie ve ein paar andere Notationen als auch, was doesn t Hilfe Allerdings ist die EMA ziemlich einfach, da Sie nur einen alten Wert erinnern müssen keine komplizierten Zustand Arrays erforderlich. answered Feb 8 12 bei 20 42. TKKocheran Ziemlich viel Isn t it nice, wenn die Dinge einfach sein können Wenn Sie mit einer neuen Sequenz beginnen, Bekomme einen neuen Mittelwert Hinweis, dass die ersten paar Begriffe in der gemittelten Sequenz um ein bisschen wegen der Grenzeffekte springen, aber du bekommst die mit anderen gleitenden Durchschnitten auch Allerdings ist ein guter Vorteil, dass man die gleitende durchschnittliche Logik in den Mittelwert einpacken kann Und experimentiere ohne zu stören den Rest deines Programms zu viel Donal Fellows Feb 9 12 bei 0 06.Ich habe eine harte Zeit, um Ihre Fragen zu verstehen, aber ich werde versuchen zu beantworten anyway.1 Wenn Ihr Algorithmus gefunden 0 25 statt 0 36, Dann ist es falsch Es ist falsch, weil es eine monotone Zunahme oder Abnahme annimmt, die immer nach oben geht oder immer hinuntergeht, es sei denn, du durchschnittst alle deine Daten, deine Datenpunkte, wie du sie präsentierst --- sind nichtlinear Wenn du es wirklich willst Um den maximalen Wert zwischen zwei Punkten in der Zeit zu finden, dann schneide dein Array von tmin zu tmax und finde das Maximum dieses Subarray.2 Jetzt ist das Konzept der gleitenden Durchschnitte sehr einfach vorstellen, dass ich die folgende Liste 1 4, 1 5 habe , 1 4, 1 5, 1 5 Ich kann es glätten, indem ich den Durchschnitt von zwei Zahlen 1 45, 1 45, 1 45, 1 5 Beachten Sie, dass die erste Zahl der Durchschnitt von 1 5 und 1 4 Sekunden und erste Zahlen ist Die zweite neue Liste ist der Durchschnitt von 1 4 und 1 5 Drittel und zweite alte Liste die dritte neue Liste der Durchschnitt von 1 5 und 1 4 vierte und dritte, und so weiter hätte ich es Zeitraum drei oder vier, oder n Hinweis Wie die Daten viel glatter ist Ein guter Weg, um gleitende Durchschnitte bei der Arbeit zu sehen ist, um zu Google Finance zu gehen, wählen Sie eine Aktie Tesla Motors ziemlich volatile TSLA und klicken Sie auf technische an der Unterseite des Diagramms Wählen Sie Moving Average mit einem bestimmten Zeitraum und Exponentieller gleitender Durchschnitt, um ihre Unterschiede zu vergleichen. Exponentieller gleitender Durchschnitt ist nur eine weitere Ausarbeitung von diesem, aber gewichtet die älteren Daten weniger als die neuen Daten, das ist ein Weg, um die Glättung in Richtung der Rückseite vorzuwerfen Bitte lesen Sie die Wikipedia-Eintrag. So, das ist mehr Ein Kommentar als eine Antwort, aber die kleine Kommentar-Box war nur zu winzigen Viel Glück. Wenn Sie Probleme mit der Mathematik haben, könnten Sie mit einem einfachen gleitenden Durchschnitt statt exponentiell Also die Ausgabe, die Sie erhalten würde die letzten x Begriffe geteilt werden Von x Ungetestetes Pseudocode. Hinweis, dass du die Anfangs - und Endteile der Daten behandeln musst, da du die letzten 5 Begriffe, wenn du auf deinem zweiten Datenpunkt bist, deutlich beurteilen kannst. Auch hier gibt es effizientere Berechnungsmethoden für diesen gleitenden Durchschnitt Summe - älteste neueste, aber dies ist, um das Konzept von dem, was passiert über. answered Feb 8 12 bei 20 41.Ich versuche, den gleitenden Durchschnitt eines Signals zu berechnen Der Signalwert ein Doppel wird zu zufälligen Zeiten aktualisiert Ich bin Auf der Suche nach einem effizienten Weg, um es zu berechnen, dass es Zeit gewichtet Durchschnitt über ein Zeitfenster, in Echtzeit konnte ich es selbst tun, aber es ist schwieriger als ich dachte. Mehr der Ressourcen, die ich über das Internet gefunden berechnen gleitenden Durchschnitt Von periodischen Signal, aber meine Updates zufällig time. Does jemand wissen, gute Ressourcen für die. The Trick ist die folgenden Sie erhalten Updates zufällig über void Update int Zeit, float Wert Sie müssen aber auch verfolgen, wenn ein Update fällt Das Zeitfenster, also stellst du einen Alarm ein, der zum Zeitpunkt N aufruft, der das vorherige Update aus der immer wieder in der Berechnung wiederhergestellt hat. Wenn dies in Echtzeit geschieht, kannst du das Betriebssystem anfordern, einen Anruf zu einer Methode auszuführen. Void dropoffoldestupdate Int Zeit, um zur Zeit N aufgerufen zu werden. Wenn dies eine Simulation ist, kannst du keine Hilfe vom Betriebssystem bekommen und du musst es manuell machen In einer Simulation würdest du Methoden mit der Zeit anrufen, die als Argument geliefert wird, das nicht mit real korreliert Zeit Eine vernünftige Annahme ist jedoch, dass die Anrufe so garantiert werden, dass die Zeitargumente zunehmen. In diesem Fall müssen Sie eine sortierte Liste von Alarmzeitwerten pflegen und für jeden Aktualisierungs - und Leseaufruf überprüfen Sie, ob das Zeitargument ist Größer als der Kopf der Alarmliste Während es größer ist, machen Sie die alarmbezogene Verarbeitung Drop off der ältesten Update, entfernen Sie den Kopf und überprüfen Sie noch einmal, bis alle Alarme vor der gegebenen Zeit verarbeitet sind Dann machen Sie den Update call. Ich habe so weit Davon ausgegangen, dass es offensichtlich ist, was Sie für die eigentliche Berechnung tun würden, aber ich werde nur für den Fall, dass ich davon ausgehen, dass Sie eine Methode Float lesen int Zeit, die Sie verwenden, um die Werte zu lesen Das Ziel ist, um diesen Anruf so effizient wie möglich machen So Sie Berechnen Sie den gleitenden Durchschnitt nicht jedes Mal, wenn die Lesemethode aufgerufen wird Stattdessen berechnen Sie den Wert ab dem letzten Update oder dem letzten Alarm und tweak diesen Wert um ein paar Gleitkommaoperationen, um den Ablauf der Zeit seit dem letzten Update zu berücksichtigen Dh eine konstante Anzahl von Operationen, außer dass man vielleicht eine Liste von aufgehäuften Alarmen verarbeitet hat. Hervorragend ist das klar - das sollte ein ganz einfacher Algorithmus und sehr effizient sein. Eine weitere Optimierung eines der verbleibenden Probleme ist, wenn eine große Anzahl von Updates innerhalb der Zeit-Fenster, dann gibt es eine lange Zeit, für die es weder Lesungen noch Updates gibt und dann ein Lesen oder Update kommt In diesem Fall wird der oben genannte Algorithmus ineffizient in inkrementeller Aktualisierung der Wert für jeden der Updates, die abfällt Dies ist nicht notwendig, weil wir uns nur um das letzte Update über das Zeitfenster hinaus kümmern, also wenn es einen Weg gibt, um alle älteren Updates effizient abzubrechen, würde es helfen. Um dies zu tun, können wir den Algorithmus ändern, um eine binäre Suche nach Updates durchzuführen Um das aktuellste Update vor dem Zeitfenster zu finden Wenn es relativ wenige Updates gibt, die gelöscht werden müssen, dann kann man den Wert für jeden gelöschten Update inkrementell aktualisieren. Aber wenn es viele Updates gibt, die gelöscht werden müssen, dann kann man den Wert neu berechnen Kratzer nach dem Ablegen der alten Updates. Anhang auf Inkremental Berechnung Ich sollte klären, was ich meine, durch inkrementelle Berechnung oben in den Satz zwicken diesen Wert durch ein paar Gleitkomma Operationen, um für den Ablauf der Zeit seit der letzten Aktualisierung Initiale nicht-inkremental Computation. then iterate über relevanteupdates in der Reihenfolge der zunehmenden time. movingaverage sum lastupdate timesincelastupdate windowlength. Now wenn genau ein Update fällt aus dem Fenster, aber keine neuen Updates ankommen, anpassen Summe als. Merke es ist priorupdate, das seinen zeitstempel modifiziert hat, um den Anfang des letzten fensteranfangs zu beginnen Und wenn genau ein Update das Fenster betritt, aber keine neuen Updates fallen, stellen Sie sum as. As sollte offensichtlich sein, das ist eine grobe Skizze, aber hoffentlich zeigt es, wie Sie Kann den Durchschnitt so beibehalten, dass es sich um O 1-Operationen pro Update auf einer amortisierten Basis handelt. Beachten Sie jedoch eine weitere Optimierung im vorherigen Absatz. Beachten Sie auch die Stabilitätsprobleme, die in einer älteren Antwort angedeutet werden, was bedeutet, dass sich Gleitkomma-Fehler über eine große Anzahl solcher Inkrementalen ansammeln können Operationen, so dass es eine Abweichung von dem Ergebnis der vollständigen Berechnung, die für die Anwendung signifikant ist. Wenn eine Annäherung ist OK und es gibt eine minimale Zeit zwischen Proben, könnten Sie versuchen, Super-Sampling Haben Sie ein Array, das gleichmäßig beabstandete Zeitintervalle, dass Sind kürzer als das Minimum, und bei jedem Zeitraum speichern Sie die letzte Probe, die empfangen wurde Je kürzer das Intervall, desto näher der Durchschnitt wird auf den wahren Wert Die Periode sollte nicht größer als die Hälfte des Minimums oder es ist eine Chance zu fehlen A sample. answered Dec 15 11 at 18 12.answered Dec 15 11 bei 22 38. Danke für die Antwort Eine Verbesserung, die es nötig wäre, um den Wert des Gesamtdurchschnitts tatsächlich zu cache, so dass wir don t Schleife die ganze Zeit auch, es Kann ein kleiner Punkt sein, aber wäre es nicht effizienter, einen Deque oder eine Liste zu verwenden, um den Wert zu speichern, da wir davon ausgehen, dass das Update in der richtigen Reihenfolge kommen wird. Einfügung wäre schneller als in der Karte Arthur Dez 16 11 bei 8 55.Ja, du kannst den Wert der Summe zwischenspeichern und die Werte der zu löschenden Samples subtrahieren, addiere die Werte der Samples, die du eingefügt hast. Also, ja, ein deque Paar Beispiel, Datum könnte effizienter sein Ich wählte Karte für Lesbarkeit und die Einfache Aufruf der Karte oberflächig Wie immer, schreibe korrekten Code zuerst, dann Profil und messen inkrementelle Änderungen Rob Dec 16 11 um 15 00.Note Anscheinend ist dies nicht der Weg, um es zu nähern Es ist hier für Referenz auf was ist falsch mit diesem Ansatz Check Die Kommentare. UPDATED - basierend auf Oli s Kommentar nicht sicher über die Instabilität, die er spricht über though. Use eine sortierte Karte der Ankunftszeiten gegen Werte Bei der Ankunft eines Wertes fügen Sie die Ankunftszeit auf die sortierte Karte zusammen mit it s Wert und Aktualisieren Sie die gleitenden Durchschnitt. Warnung ist dies Pseudo-Code. There nicht vollständig ausgefunden, aber Sie bekommen die idea. Things zu beachten Wie ich sagte, das oben ist Pseudocode Sie müssen eine passende Karte wählen Don t entfernen Sie die Paare, wie Sie iterieren Durch, wie Sie den Iterator ungültig machen und müssen wieder anfangen Siehe Oli s Kommentar unten auch. derwerted Dec 15 11 at 12 22.This doesn t Arbeit es nicht berücksichtigen, welcher Anteil der Fensterlänge jeder Wert existiert auch , Dieser Ansatz des Hinzufügens und dann Subtrahieren ist nur stabil für ganzzahlige Typen, nicht Schwimmer Oliver Charlesworth Dec 15 11 bei 12 29. OliCharlesworth - sorry ich vermisste einige wichtige Punkte in der Beschreibung doppelt und zeitgewichtet Ich werde aktualisieren Danke Dennis Dec 15 11 Bei 12 33. Die Zeitgewichtung ist noch ein weiteres Problem Aber das ist nicht das, worüber ich rede, ich habe darauf hingewiesen, dass, wenn ein neuer Wert zuerst in das Zeitfenster eintritt, sein Beitrag zum Durchschnitt minimal ist. Der Beitrag steigt weiter an Bis ein neuer Wert in Oliver Charlesworth Dec 15 11 bei 12 35.Pseudocode-Beispiele eintritt. Ein Algorithmus ist ein Verfahren zur Lösung eines Problems in Bezug auf die auszuführenden Aktionen und die Reihenfolge, in der diese Aktionen ausgeführt werden sollen. Ein Algorithmus ist nur der Abfolge von Schritten zur Lösung eines Problems Die Schritte sind normalerweise Sequenz, Selektion, Iteration und eine Case-Type-Anweisung. In C sind Sequenz-Anweisungen zwingend erforderlich Die Auswahl ist die if-else-Anweisung und die Iteration wird durch eine Anzahl von erfüllt Aussagen, wie die while, do, und die für, während die Case-Type-Anweisung von der switch-Anweisung erfüllt ist. Pseudocode ist eine künstliche und informelle Sprache, die Programmierer hilft, Algorithmen zu entwickeln Pseudocode ist ein textbasiertes Detail algorithmisches Design-Tool Regeln von Pseudocode sind vernünftig einfach Alle Aussagen, die die Abhängigkeit zeigen, sind zuzuordnen. Dazu gehören, während, tun, für, wenn, schalten Beispiele unten wird diese Vorstellung veranschaulichen.1 Wenn Schüler s Grade größer als oder gleich 60.2 Set total to zero. Set Grade Zähler zu einem. While Grade Zähler ist kleiner als oder gleich zehn. Input die nächste Klasse. Geben Sie die Klasse in die total. Set die Klasse Durchschnitt auf die Summe geteilt durch zehn. Print die Klasse average. Initialize total to zero. Initialize Counter to zero. Erhalten Sie die erste Klasse. Während der Benutzer noch nicht in den Sentinel. add diese Klasse in die laufende total. add ein auf die Klasse counter. input die nächste Klasse möglicherweise die Sentinel. if der Zähler ist nicht gleich Zero. set den Durchschnitt auf die Summe geteilt durch die counter. print die average. print keine Noten wurden eingegeben. initialize übergibt an zero. initialize Ausfälle auf zero. initialize Schüler zu one. while Schülerzähler ist kleiner oder gleich zehn. input Die nächste Prüfung Ergebnis. wenn die Schüler passiert. add ein zu passes. add ein zu failures. add ein zu student counter. print die Anzahl der passes. print die Anzahl der failures. if acht oder mehr Studenten bestanden. print heben Unterricht. Some Schlüsselwörter, die verwendet werden sollten. Für Looping und Selektion, Die Schlüsselwörter, die verwendet werden sollen, gehören Do While EndDo Do bis Enddo Case EndCase Wenn Endif Call mit den Parametern Call Return Return Wenn immer Trainer-Terminatoren für Loops und Iteration verwenden. Als Verben verwenden Sie die Worte generieren, berechnen, verarbeiten, etc Wörter wie Set, Reset, Inkrement, berechnen, berechnen, addieren, Summe, Multiplikation drucken, Display, Eingabe, Ausgabe, Bearbeiten, Test usw. mit sorgfältiger Einrückung neigen dazu, wünschenswertes Pseudocode zu fördern Datendeklarationen in Ihrem Pseudocode.
No comments:
Post a Comment