Wednesday, 22 March 2017

Pseudo Code Moving Average

Pseudocode Einführung Für das Erhalten der Schildkröte, um einfache Dinge, wie eine Kiste zu zeichnen, können Sie einfach eingeben Logo Anweisungen in TGs CommandCenter und die meiste Zeit Ihr Programm nur funktioniert. Es tut, was Sie es wollten, was Sie dachten, es würde tun. Allerdings, wenn Sie ein nicht-triviales Programm schreiben, wird dies selten der Fall sein. Je mehr Anweisungen, die Sie in Ihre Programme, desto mehr müssen Sie in Ihrem Kopf, in Ihrem Arbeitsgedächtnis zu halten, über was youre tun. Je mehr Anweisungen, desto mehr Tippen Sie tun, desto mehr Chancen oder einen Tippfehler. Und schließlich, je mehr Anweisungen, desto mehr Chancen, einen Fehler zu machen. In dieser Lektion lernen Sie, wie man Computerprogramme in Schritten schreibt. Der erste Schritt wird sein, nur darüber nachzudenken, was Sie tun müssen. Im nächsten Schritt schreiben Sie, was das Programm im Pseudocode tun soll. Ein dritter Schritt ist die Umwandlung des Pseudocodes in richtig geformte Befehle, die in der von Ihnen verwendeten Programmiersprache zur Verfügung stehen, Logo in unserem Fall. Wie man nicht-triviale Programme schreibt, die tun, was Sie wünschen Als Sie die Übungen am Ende der letzten Lektion taten. Meine Vermutung ist, dass Sie nicht in Programme, die perfekt funktionierte das erste Mal. Wenn ja, herzlichen Glückwunsch. Sie sind bei der Visualisierung und geordneten Gedanken groß. Die gute Nachricht ist, dass jeder lernen, richtige Programme schreiben kann - ein erfahrener Programmierer hätte kein Problem schriftlich korrekte Programme für diese Übungen. Ein erfahrener Programmierer würde darüber nachdenken, wie das Problem zu lösen, bevor sie mit der Eingabe in Anweisungen beginnen würde. Ein erfahrener Programmierer würde das Problem in Stücke brechen, die jeder von ihnen einfach zu tun sind. Dann setzen Sie alle Stücke zusammen, um das Problem zu lösen. In der Informatik ist dies ein Prozess, der schrittweise Verfeinerung genannt wird. Sie brechen das Problem in Schritten und dann verfeinern, was jeder Schritt tut. Lets play erfahrene Programmierer mit der ersten Übung aus der vorherigen Lektion. Verstehen des Problems Was Sie zuerst tun sollten, ist darüber nachzudenken, was Sie tun müssen. Holen Sie sich etwas Papier und einen Bleistift, um Ihre Gedanken niederzuschreiben. Schauen Sie sich das Diagramm sorgfältig an. Versuchen Sie, die Kästchen zu zeichnen. Wie haben Sie es tun Wie können Sie brechen die Zeichnung, reduzieren ihre Komplexität Sie müssen die Schildkröte zu: ziehen dreizehn Liniensegmente (sechs horizontale und sieben vertikale). Beginnen Sie an einer Ecke und gehen Sie einfach die Schildkröte um, vorwärts, rückwärts, rechts drehen, links abbiegen, bis alle Liniensegmente gemalt sind. - ODER - zeichnen Sie vier Rechtecke eins ist groß und dünn drei sind kurz und bilden einen Stapel von Rechtecken auf der rechten Seite des ersten - ODER - ziehen Sie sieben Linien (vier horizontale und drei vertikale) vier Linien bilden den Umfang eines großen Rechtecks ​​ein Linie teilt dieses Rechteck in halb vertikal zwei Linien spaltete die rechte Hälfte des Rechtecks ​​in drei gleichgroße Rechtecke Kannst du an irgendwelche andere Möglichkeiten denken, zu brechen und zu beschreiben, was die Schildkröte angewiesen werden muss, ok zu tun. Damit ist das Verständnis der Problemphase abgeschlossen. Entwerfen eines Plans So haben Sie jetzt einige Skizzen und Notizen auf einem Blatt Papier, die Wege, die zu einer Lösung führen zu beschreiben. Der nächste Schritt ist, über einen Ansatz zu entscheiden und zusammen Anweisungen, ein Prozess. eine Prozedur . Die die Schildkröte erhält, um die Figur zu zeichnen. Lets folgen unseren erfahrenen Programmierer Gedanken durch den Rest einer Lösung. Sie hat gewählt, ein Quadrat (eine spezielle Art von Rechteck) zu zeichnen und es zu unterteilen. Ihr erster Schritt: herauszufinden, wie viele Schildkröte Schritte auf jeder Seite des Platzes sein sollte. Da sie in zwei Hälften und in Drittel geteilt wird, will sie eine Länge, die ein Vielfaches von zwei und drei ist. Sie liebt schöne runde Zahlen, so dass sie jede Seite des Platzes 120 Schildkröte Schritte (120/260 120/340) macht. Wie Sie sehen können, ist es schön, ein wenig Mathe wissen, wenn youre Programmierung eines Computers. Die meisten Programmierer würden nicht über die Größe als ein erster Schritt gedacht haben. Also, wenn dies gefangen Sie überrascht, keine große Sache. Sie hätten herausgefunden, dass es wichtig ist, wenn Sie weiter waren. Aber es ist wichtig für Sie, um das Niveau der Details wissen, dass ein erfahrener Programmierer betrachtet, dass Sie schließlich darüber nachzudenken, wenn Sie große Programme schreiben. Mit diesem entschieden, schreibt der erfahrene Programmierer zuerst ihr Programm auf Papier in Pseudocode. Pseudocode ist Jargon, um etwas in Ihrer Muttersprache zu beschreiben. Ihr Pseudocode ist Englisch beschreibt, was sie will, dass ihr Programm zu tun. Sobald dies abgeschlossen ist und sie ist überzeugt, dass ihr Plan zu produzieren, was sie will, seine Zeit für die nächste Phase: Konvertierung der Pseudocode in Logo-Anweisungen. Durchführen der Planzeit, um den Plan in ein Programm umzuwandeln, das auf einem Computer ausgeführt werden kann. Da sie in Logo programmiert, konvertiert unser Expertenprogrammierer den Pseudocode in Anweisungen, die in dieser Computersprache verfügbar sind. Tabelle 3.1 zeigt sowohl den Pseudocode als auch die Ergebnisse seiner Umwandlung in das Logo. Pseudocode (auf Papier geschrieben) Logo Anleitung (Typed on Computer) Unser erfahrener Programmierer bringt das TG Applet in einen Browser auf ihrem Computer. TG versteht einen Dialekt der Logo-Programmiersprache mit einem Logo-Interpreter. Sie liest ihre Pseudocode-Notizen und wandelt sie in Logo-Anweisungen in ihrem Kopf um und gibt die Anweisungen in das CommandCenter ein. Da jede Zeile eingegeben wird, beobachtet sie die Schildkröte genau, was sie erwartet. Blick zurück Schließlich überprüft unser erfahrener Programmierer, was sie getan hat. In diesem Fall untersucht sie die Grafiken und fragt sich, ob die Grafik, die ich produziert habe, mit der Zeichnung übereinstimmt, die ich anfing zu produzieren. Mit anderen Worten, ist ihr Programm korrekt Auf der Suche nach ihren Anweisungen, ihr (Quellcode, reflektierend über ihre Wahl des Ansatzes, sie Fragt mich Habe ich die richtige Wahl des Ansatzes Wenn ich das Programm wieder schreiben würde, würde ich es auf die gleiche Weise Was war der schwierigste Teil Gibt es eine Möglichkeit, ich hätte es einfacher machen Schließlich wird sie über den Code denken, Vergleich sie in ihrem Kopf mit anderen ähnlichen Programmen, die sie geschrieben hat. Sie ​​wird sich fragen, Ist ein Muster entwickeln Kann jeder der Quellcode, den sie geschrieben hat, in der Zukunft verwendet werden, um ein ähnliches Programm einfacher zu machen Unser erfahrener Programmierer konsolidiert ihr Wissen über Schreiben von Programmen in Logo. Dies hilft ihr in der Zukunft. Mit TGs-Editor anstelle von Papier Es ist möglich, von Bleistift und Papier auf das TG-Applet für die Erarbeitung eines Plans und Durchführung der Plan Schritte. Ich wurde gelehrt, meine schreiben Programmen auf Papier vor 44 Jahren. Aber meine Interaktion mit einem Computer bestand aus immer ein wenig Zeit auf einem Computer, den ich mit hundert anderen Programmierern teilte. Daher war die Verwendung von Papier und einem Bleistift für das Schreiben von Programmen wichtig. Aber jetzt hat jeder seinen eigenen Computer. Lets verschieben, um dies zu nutzen und die Verwendung von Papier und Bleistift für diesen Schritt zu beseitigen. HINWEIS: Papier und Bleistift ist immer noch der beste Ansatz für das Verständnis des Problems zumindest das ist meine Meinung. Sie tun dies mit TGs Editor. TGs-Editor öffnen Ab der Version .9.36.6 von TG gibt es eine einfache Möglichkeit, den Editor, die Editor-Direktive, zu öffnen. Einfach Typ-Editor oder die Abkürzung bearbeiten in das CommandCenter auf einer Zeile alle von selbst. In älteren Versionen von TG wird der Editor mit dem Menüpunkt Window-gtEditor-gtOpen geöffnet. In der TG-Anwendung ist das Menüsystem unter Verwendung des standardmäßigen Pull-down-Streifens über die Oberseite leicht verfügbar. Um auf das Menüsystem im TG-Applet zuzugreifen, positionieren Sie die Maus im Applet und halten Sie die rechte Maustaste gedrückt. Positionieren Sie die Maus über den Menüpunkt Fenster, um das Untermenü aufzurufen, das Untermenü des Editors auszuwählen und schließlich die Option Öffnen auszuwählen. Abbildung 3.2 zeigt dies. In beiden Fällen wird ein Editor-Unterfenster unterhalb des CommandCenter am unteren Rand des Applets angezeigt. An dieser Stelle können Sie die Höhe der Unterfenster einstellen, indem Sie das Mäuse-Icon über einen der Namensstreifen positionieren, die linke Maustaste gedrückt halten und den Namensstreifen nach oben oder unten ziehen. Da wir den Editor verwenden werden, machen Sie ihn ein bisschen größer, ziehen Sie zuerst den CommandCenter-Namenstreifen nach oben und ziehen Sie den Editor-Namen-Streifen nach oben. Eingabe von Kommentaren in den TGs-Editor Für die Erstellung eines Plans müssen wir die Pseudocode-Darstellung des Programms eingeben. Nun, das ist ein Problem. Ein Logo-Interpreter nicht verstehen, Pseudocode und es wird beschweren, wenn wir es in. Wir lösen dieses Problem, indem Sie den Pseudocode als Kommentare. Kommentare in Logo beginnen mit dem Semikolon () Zeichen und gehen durch das Ende der Zeile. Kommentare werden von Menschen gelesen und von einem Interpreter ignoriert. Abbildung 3.3 zeigt das TG-Applet, nachdem der Pseudocode aus der vorherigen Übung in den Editor eingegeben wurde. Speichern des Inhalts des Editors Was passiert, wenn Sie irgendwo hingehen oder etwas anderes machen müssen Wenn Sie die TG-Programmierumgebung auf dieser Webseite verwenden, können Sie nichts anderes tun als kopieren, was sich auf dem Display befindet Mitnehmen. Aber wenn Sie die TG-Programmierung environmnet auf Ihrem Computer haben, können Sie den Inhalt des Editors in einer Datei auf Ihrem Computer speichern. Wählen Sie File-gtSave as. Wählen. Abbildung 3.4 zeigt dies. Um TG auf Ihrem Computer zu installieren, siehe Anhang H Installation von TG. An dieser Stelle wird ein Fenster geöffnet, in dem Sie ein Verzeichnis auswählen und einen Dateinamen angeben können, um den Inhalt des Editors zu speichern. Wie dieses Fenster aussieht und wie Sie mit ihm interagieren, ist auf verschiedenen Computern unterschiedlich, z. B. Einem Microsoft Windows-Desktop und einem Apple MacBook. Sobald das Speichern abgeschlossen ist, können Sie TG beenden. Wenn Sie die Arbeit an Ihrem Programm fortsetzen möchten, starten Sie TG und wählen Sie File-gtOpen. Wählen. Ein System-abhängiges Fenster wird Pop-up und Sie können es zu finden und wählen Sie das Programm, das Sie zuvor gespeichert. TGs Editor wird mit dem ausgewählten Dateien Inhalt darin öffnen. Eingabe von Logo-Instruktionen In den Editor So, wir sind nun bereit für das Ausführen des Plan-Schrittes. Unter jedem Kommentar konvertieren wir den Pseudocode in die entsprechenden Logo-Anweisungen. Abbildung 3.5 zeigt das TG-Applet, nachdem die Logo-Anweisungen hinzugefügt wurden. Das Erhalten von TG, um den Inhalt des Herausgebers durchzuführen So, anders als, wenn wir Logoanweisungen in das CommandCenter eintraten, ist nichts geschehen, während wir Material im Redakteur betraten. Wie erhalten wir den Logo-Interpreter, um die Instruktionen durchzuführen, die wir in den Editor geschrieben haben Der einfachste Weg ist, den Fokus aus dem Editor zu übertragen. Sie haben vielleicht bemerkt, dass das Unterfenster von TG, mit dem Sie interagieren, dasjenige, das den Fokus hat, schwarz hervorgehoben ist (im Gegensatz zu grau). Klicken Sie mit der Maus im CommandCenter oder in der Grafikleinwand. Wenn Sie die TG-Anwendung anstelle des Applets verwenden, können Sie die Tastenkombinationen "Strg-Tab" oder "Umschalttaste" verwenden, um den Fokus von einem der TG-Unterfenster zu einem anderen zu verschieben. Wenn Sie den Fokus vom Editor auf ein anderes Unterfenster übertragen und der Inhalt des Editors geändert wurde, wird der Inhalt des Editors vom TGs-Logo-Interpreter bearbeitet. Im Falle unseres Beispiels zieht die Schildkröte die Schachteln. Sie können auch den Menüpunkt Window-gtEditor-gtInterpret verwenden. Abbildung 3.6 zeigt dies. Und schließlich, Abbildung 3.7 zeigen die Ergebnisse, unsere Reihe von Feldern genau wie erwartet gezeichnet. THROTTLING Graphics Aids Debugging Die Leistung von modernen Computern ist so groß, dass die meiste Zeit, wenn Ihre Programme zeichnen in der Grafik-Leinwand, seine gerechte Poof. Erscheint das komplette Bild. Wenn Sie nicht bekommen, was Sie dachten, Sie haben angewiesen, die Schildkröte zu tun oder wenn Sie nur sehen wollen, die Schildkröte führen Sie die Grafiken, können Sie mit dem Befehl THROTTLE. THROTTLE folgt eine Zahl, die Millisekunden (1 / 1000s einer Sekunde), die Sie wollen, dass die Schildkröte, nachdem einige Grafik-Anweisungen ausruhen. Also, um die Schildkröte für eine halbe Sekunde Pause zu erhalten, geben Sie einen throttle 500 Befehl. Wenn TGs Dolmetscher Ihr Programm durchführt, können Sie sehen, wie sich die Schildkröte bewegt, was sie unterrichtet hat. HINWEIS THROTTLE funktioniert nur, wenn die Schildkröte sichtbar ist. Also, stellen Sie sicher, dass, wenn Sie eine HIDETURTLE-Anweisung in Ihrem Programm enthalten, sollte es nach allen Grafiken Anweisungen. Die Drosselung kann entweder mit einer Drosselklappe 0-Anweisung oder mit dem Notlauf-Befehl ausgeschaltet werden. Übung: Mehr geteilte Felder Verlängern Sie das Programm, das wir gerade eine Komplettlösung von. bnbsp abgeschlossen haben. Fassen Sie das untere rechte Feld in vier Kästen. Abbildung 3.8 zeigt, was gewünscht wird. Wenn Sie die TG-Anwendung verwenden, hier ist die Basis-Source-Code können Sie kopieren / Einfügen in TGs Editor. TG Applet (loadcode) Wenn Sie lieber das TG-Applet verwenden möchten. Wählen Sie zuerst die Option Datei-Neu im Menüsystem, um den Editor zu öffnen (oder wenn es bereits geöffnet ist, wird der Inhalt gelöscht), und geben Sie loadcode DividedBoxes in das CommandCenter ein. Dadurch wird der Quellcode in den Editor eingefügt, wo Sie ihn erweitern können. Übung: Haus zeichnen Versuchen Sie diesen neuen Ansatz. Schreiben Sie ein Programm, das das in Abbildung 3.9 dargestellte einfache Haus zeichnet. Gehen Sie alle Schritte vor: Ich versuche, den gleitenden Durchschnitt eines Signals zu berechnen. Der Signalwert (ein Doppel) wird zu beliebigen Zeiten aktualisiert. Ich bin auf der Suche nach einem effizienten Weg, um seine Zeit gewichteten Durchschnitt über ein Zeitfenster, in Echtzeit zu berechnen. Ich könnte es selbst tun, aber es ist schwieriger als ich dachte. Die meisten der Ressourcen Ive gefunden über das Internet berechnen gleitenden Durchschnitt des periodischen Signals, aber Mine Updates zu beliebigen Zeit. Kennt jemand gute Ressourcen für die Der Trick ist die folgende: Sie erhalten Updates zu beliebigen Zeiten über void update (int Zeit, float-Wert). Allerdings müssen Sie auch nachverfolgen, wenn ein Update fällt aus dem Zeitfenster, so dass Sie einen Alarm, der bei der Zeit N, die die vorherige Aktualisierung entfernt wird immer wieder in der Berechnung berücksichtigt. Wenn dies in Echtzeit geschieht, können Sie das Betriebssystem anfordern, einen Aufruf einer Methode void dropoffoldestupdate (int time) aufzurufen, die zum Zeitpunkt N aufgerufen werden soll. Wenn es sich um eine Simulation handelt, können Sie keine Hilfe vom Betriebssystem bekommen und müssen dies tun Tun Sie es manuell. In einer Simulation würden Sie Methoden mit der angegebenen Zeit als Argument aufrufen (was nicht mit der Echtzeit korreliert). Eine vernünftige Annahme ist jedoch, dass die Anrufe so gewartet werden, dass die Zeitargumente zunehmen. In diesem Fall müssen Sie eine sortierte Liste der Alarmzeitwerte pflegen und bei jedem Aktualisierungs - und Leseaufruf überprüfen, ob das Zeitargument größer ist als der Kopf der Alarmliste. Während es größer ist, tun Sie die alarmbezogene Verarbeitung (Drop off der ältesten Aktualisierung), entfernen Sie den Kopf und überprüfen Sie erneut, bis alle Alarme vor der angegebenen Zeit verarbeitet werden. Anschließend den Update-Aufruf durchführen. Ich habe bis jetzt angenommen, dass es offensichtlich ist, was Sie für die tatsächliche Berechnung tun würden, aber ich erarbeiten gerade für den Fall. Ich nehme an, Sie haben eine Methode float read (int Zeit), die Sie verwenden, um die Werte zu lesen. Das Ziel ist, diesen Anruf so effizient wie möglich zu machen. So berechnen Sie den gleitenden Durchschnitt nicht jedes Mal, wenn die Lesemethode aufgerufen wird. Stattdessen müssen Sie den Wert der letzten Aktualisierung oder des letzten Alarms vorberechnen und diesen Wert durch ein paar Gleitkommaoperationen anpassen, um die Zeit seit der letzten Aktualisierung zu berücksichtigen. (D. h. eine konstante Anzahl von Operationen, außer dass möglicherweise eine Liste von aufgestauten Alarmen verarbeitet wird). Hoffentlich ist dies klar - das sollte ein ganz einfacher Algorithmus und sehr effizient sein. Weitere Optimierung. Einer der verbleibenden Probleme ist, wenn eine große Anzahl von Updates innerhalb des Zeitfensters auftreten, dann gibt es eine lange Zeit, für die es weder liest noch Updates, und dann ein Lesen oder Update kommt entlang. In diesem Fall ist der obige Algorithmus ineffizient, wenn der Wert für jedes der Aktualisierungen, die herunterfallen, inkremental aktualisiert wird. Dies ist nicht notwendig, weil wir nur kümmern uns um die letzte Aktualisierung über das Zeitfenster so, wenn es einen Weg, um effizient drop off alle älteren Updates, 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 neueste 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 jedes heruntergelassene Update inkremental aktualisieren. Aber, wenn es viele Updates gibt, die gelöscht werden müssen, dann kann man den Wert vom Kratzer neu berechnen, nachdem er weg von den alten Updates. Anhang auf Inkrementelle 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 dem letzten Update. Initiale nicht-inkrementale Berechnung: dann über die relevanten Daten in der Reihenfolge der zunehmenden Zeit iterieren: movingaverage (sum lastupdate timesincelastupdate) / windowlength. Nun, wenn genau ein Update fällt aus dem Fenster, aber keine neuen Updates eintreffen, stellen Sie die Summe als: (beachten Sie, es ist Priorupdate, deren Timestamp geändert, um den Beginn der letzten Fenster beginnt). Und wenn genau ein Update in das Fenster eintritt, aber keine neuen Updates abfallen, passen Sie die Summe als an: Wie offensichtlich sein sollte, ist dies eine grobe Skizze, aber hoffentlich zeigt es, wie Sie den Durchschnitt so halten können, dass es O (1) Operationen pro Update ist Auf amortisierte Basis. Aber beachten Sie weitere Optimierung im vorherigen Absatz. Beachten Sie auch Stabilitätsprobleme, auf die in einer älteren Antwort hingewiesen wird, was bedeutet, dass Gleitkomma-Fehler über eine große Anzahl derartiger Inkrementierungsoperationen akkumulieren können, so dass es eine Abweichung von dem Ergebnis der Vollberechnung gibt, die für die Anwendung signifikant ist. Wenn eine Annäherung OK und theres eine minimale Zeit zwischen Proben ist, könnten Sie versuchen, Super-Sampling. Sie haben ein Array, das gleichmäßig beabstandete Zeitintervalle repräsentiert, die kürzer als das Minimum sind, und zu jedem Zeitpunkt die letzte empfangene Probe speichern. Je kürzer das Intervall, desto näher ist der Mittelwert auf den wahren Wert. Der Zeitraum sollte nicht größer als die Hälfte des Minimums sein, oder es besteht die Möglichkeit, eine Stichprobe zu fehlen. Antwortete Dec 15 11 at 18:12 antwortete 15 Dez, um 22:38 Uhr Danke für die Antwort. Eine Verbesserung, die erforderlich wäre, um tatsächlich Quotecachequot den Wert des Gesamtdurchschnitts, so dass wir don39t Schleife die ganze Zeit. Auch kann es ein kleiner Punkt sein, aber wäre es nicht effizienter, ein deque oder eine Liste zu verwenden, um den Wert zu speichern, da wir davon ausgehen, dass die Aktualisierung in der richtigen Reihenfolge kommen wird. Einfügen wäre schneller als in der Karte. Ndash Arthur Ja, Sie könnten den Wert der Summe zwischenspeichern. Subtrahieren Sie die Werte der Proben, die Sie löschen, fügen Sie die Werte der Proben, die Sie einfügen. Auch, ja, ein dequeltpairltSample, Dategtgt könnte effizienter sein. Ich wählte Karte für Lesbarkeit, und die Leichtigkeit der Aufruf der Karte :: upperbound. Wie immer, schreiben Sie den richtigen Code zuerst, dann Profil und messen inkrementelle Änderungen. Ndash Rob Dez 16 11 um 15:00 Hinweis: Anscheinend ist dies nicht der Weg, um dies zu nähern. Lassen Sie es hier als Referenz auf, was ist falsch mit diesem Ansatz. Überprüfen Sie die Kommentare. AKTUALISIERT - basierend auf Olis Kommentar. Nicht sicher über die Instabilität, dass er aber reden. Verwenden Sie eine sortierte Karte der Ankunftszeiten mit Werten. Bei der Ankunft eines Wertes addieren Sie die Ankunftszeit zur sortierten Karte zusammen mit ihrem Wert und aktualisieren Sie den gleitenden Durchschnitt. Warnung dies ist Pseudocode: Dort. Nicht vollständig ausgefuellt, aber Sie bekommen die Idee. Was zu beachten ist. Wie ich schon sagte ist Pseudocode. Youll Notwendigkeit, eine passende Karte zu wählen. Entfernen Sie nicht die Paare, während Sie iterieren, indem Sie den Iterator ungültig machen und müssen wieder neu starten. Siehe Olis Kommentar unten auch. Antwort # 2 am: Dezember 15, 2010, um 12:22 Uhr Dies doesn39t Arbeit: es doesn39t berücksichtigen, welcher Anteil der Fensterlänge jeder Wert für vorhanden ist. Auch dieser Ansatz der Addition und dann Subtraktion ist nur stabil für Ganzzahl-Typen, nicht Floaten. Ndash Oliver Charlesworth OliCharlesworth - sorry Ich habe einige wichtige Punkte in der Beschreibung (doppelt und zeitgewichtet) verpasst. Ich werde aktualisieren. Vielen Dank. Ndash Dennis Dec 15 11 at 12:33 Die Zeitgewichtung ist ein weiteres Problem. Aber das ist nicht das, worüber ich rede. Ich bezog sich auf die Tatsache, dass, wenn ein neuer Wert zuerst das Zeitfenster betritt, sein Beitrag zum Durchschnitt minimal ist. Ihr Beitrag steigt, bis ein neuer Wert eintritt. Ndash Oliver Charlesworth Dez 15 11 um 12: 35C Algorithmus für Null-Latenz-exponentiellen gleitenden Durchschnitt Letzte Änderung: 2012-08-13 Ich habe versucht, eine Niederfrequenz-Cutoff in c, die im Wesentlichen nimmt einen Strom von Zahlen und glättet die Ausgabe Ausfiltern von Hochfrequenzbewegungen / Jitter), es ist jedoch wichtig, dass die vorgewichteten Zahlen sofort betrachtet werden, da die Daten zeitkritisch sind (es ist, eine Bewegungssimulationsbasis unter Verwendung einer Ausgabe von einer kleinen Spielsoftware zu steuern). Ive bekam einen funktionierenden gewichteten gleitenden Durchschnitt Algoithm, konnte aber mit etwas ein wenig mehr reagieren an der Vorderseite zu tun, und ich fand dies: - Der Pseudo-Code gibt es wie folgt: Eingaben: Preis (NumericSeries), Period (NumericSimple) Variablen: Faktor 2 / (Periode1) Verzögerung (Periode-1) / 2 Ende sonst beginnen ZLEMA-Faktor (2Price-Pricelag) (1-Faktor) ZLEMA1 Ende Ive übersetzt Es in C und mein Code ist wie folgt: Allerdings scheint es nicht so zu verhalten, wie Id erwarten. Es scheint fast da, aber manchmal bekomme ich einen etwas niedrigeren Wert als alle Elemente in der Warteschlange (wenn sie alle höher sind). Meine Warteschlange und die Anzahl der Elemente in ihr als Parameter übergeben werden, mit der jüngsten an der Front zu allen Zeiten, auch ich passieren einen inkrementierenden Zähler beginnend bei 0, wie von der Funktion erforderlich. Ich bin nicht sicher, Ive interpretiert die Bedeutung von ZLEMA1 korrekt als seine nicht klar, in seinem Pseudocode, so dass Ive davon ausgegangen, dass die letzten Anrufe zlema und auch Im Annahme Preis tatsächlich bedeutet Price0. Vielleicht Ive erhielt dieses falsch Ich soll die wirklichen zlema berechneten Werte zurück zu meiner ursprünglichen Warteschlange vor dem folgenden Anruf kopieren Ich ändere nicht die ursprüngliche Warteschlange an allen anderen als nur, alle Werte eins bis zum Ende zu verschieben und das späteste am Anfang einzusetzen . Der Code, den ich verwenden, um dies zu tun ist: Wäre äußerst dankbar, wenn jemand mit einem besseren Verständnis der Mathematik könnte bitte Verstand überprüfen dies für mich zu sehen, ob Ive etwas etwas falsch Vielen Dank im Voraus, wenn Sie helfen können Erstens Dank allen für Ihre Eingabe, viel geschätzt Das macht Sinn, denke ich, so nehme ich an, dann das Beste, das ich hoffen kann, ist einfach ein exponentieller gleitender Durchschnitt, akzeptiert wird es ein wenig Verzögerung, aber dies wird durch die stärkere Front Gewichtung als in typisch gewichtet gegeben minimiert werden Ich habe auch diesen Algorithmus, aber ein ähnliches Problem, dass die Werte nicht ganz richtig erscheinen (es sei denn, dies ist die Art der Formel). Zum Beispiel, sagen, mein Array enthält 16 Werte, alle 0.4775 - die Ausgabe ist 0.4983, aber Id erwarten, dass es 0.4775 Dies schaut nach rechts zu Ihnen. / Exponentieller gleitender Durchschnitt. / Float ema (float vals, int numVals, int currentSample) statischer Schwimmerfaktor 0 statischer float lastema 0 float ema if (currentSample lt 1) ema vals0 Faktor 2.0 / ((float) numVals) 1.0) sonst ema (Faktor vals0) (1.0 - Faktor) lastema) lastema ema return ema Umgekehrt ist manchmal die Ausgabe niedriger als jeder einzelne Eingang, auch wenn alle höher sind. Es wird auf die gleiche Weise wie zlema (.) Oben mit einem inkrementierenden Zähler aufgerufen. Die Formel und Pseudocode für diese sind hier: - autotradingstrategy. wordpress / 2009/11/30 / expo nential-mo ving-avera ge / Danke nochmals, Entschuldigung für mein Missverständnis einiger Grundlagen: (Viele Grüße, Chris J As Für den Code, den ich gepostet, youre Recht über die Array-Größe Situation. Das sollte leicht behoben werden. Is für Ihre Fragen: 1) Die Filter-Konstante stellt eine Frequenz cutoff. Ich habe eine digitale Signalverarbeitung (DSP) für diese Technik. De. wikipedia. org/wi ki / Low-pas sfilter ist eine einfache Erklärung. Sie möchten die Discrete-Time-Realisierung. In meinem Fall ist die A die RC-Konstante, über die sie sprechen. Die Frequenz, die sie ausschaltet, liegt also über 1 / (2piA). Wenn Sie nicht über ein Verständnis von Frequency-Domain Theorie haben, kann dies kompliziert. In Ihrem Fall, Je höher Sie A, desto niedriger die Frequenz, die dieser Filter zulassen wird, bedeutet, dass es die Kurve aus mehr und mehr glätten wird. Je niedriger Sie es machen, desto mehr Rauschen ist im System erlaubt. Denken Sie daran, dass ein Muss größer oder gleich 1 wirksam sein muss. Ich habe die XLS wieder befestigt, diesmal ohne die wechselnden rand () Zahlen. Passen Sie die A-Konstante an und beobachten Sie, wie es quotsmoothsquot (oder filtert) die hochfrequenten Variationen. 2) Der letzte Punkt des Eingabefeldes hat den letzten Wert. 3) Gleiches gilt für das Ausgabe-Array. Der letzte ist der jüngste Wert. 5) Die NUMVALS ist beliebig. Sie können kontinuierlich auf die Eingabe-und Ausgabe-Array so oft wie youd wie hinzufügen und es würde nicht den Filter. Insbesondere verwendete ich 49 Punkte. Aber ich kann leicht löschen Sie die letzten 20 und die ersten 29 Ausgänge bleiben die gleichen. Die Funktion basiert nicht darauf, wie viele Punkte verwendet werden. Ich möchte erwähnen, dass ich diese Funktion für eine einmalige Konvertierung entwickelt habe. Wenn Sie eine Umwandlung für den nächsten Wert on the fly tun wollten, konnten Sie etwas einfacheres versuchen (wie angebracht). Wieder Im rostig auf c. Ich hoffe, das ist richtig. Das einzige, was Sie benötigen, um zu liefern ist die Eingangs - und Filterkonstante. Lassen Sie mich wissen, wenn dies hilft.


No comments:

Post a Comment