Wednesday, 17 May 2017

Moving Average Nan Matlab


Mit MATLAB, wie kann ich den 3-tägigen gleitenden Durchschnitt einer bestimmten Spalte einer Matrix finden und den gleitenden Durchschnitt an diese Matrix anschließen Ich versuche, den 3-tägigen gleitenden Durchschnitt von unten nach oben der Matrix zu berechnen, die ich mir zur Verfügung gestellt habe Code. Geben Sie die folgende Matrix a und mask. Ich habe versucht, die Umsetzung der Conv-Befehl, aber ich bin ein Fehler Hier ist der Conv-Befehl habe ich versucht, auf der 2. Spalte der Matrix a verwenden. Die Ausgabe, die ich wünsche, ist in der Folgende Matrix. Wenn Sie irgendwelche Vorschläge haben, würde ich es sehr dankbar sein Danke. Für Spalte 2 der Matrix a, ich berechnen die 3-Tage gleitenden Durchschnitt wie folgt und Platzierung des Ergebnisses in Spalte 4 der Matrix ein Ich benannte Matrix a als WantedOutput nur zur Veranschaulichung Der 3-Tages-Durchschnitt von 17, 14, 11 ist 14 der 3-Tages-Durchschnitt von 14, 11, 8 ist 11 der 3-Tages-Durchschnitt von 11, 8, 5 ist 8 und der 3-Tage-Durchschnitt von 8, 5, 2 ist 5 Es gibt keinen Wert in den unteren 2 Zeilen für die 4. Spalte, da die Berechnung für den 3-tägigen gleitenden Durchschnitt an der Unterseite beginnt. Die gültige Ausgabe wird erst bei mindestens 17, 14 und 11 angezeigt Hoffentlich ist das sinnvoll Aaron Jun 12 13 bei 1 28. Im Allgemeinen würde es helfen, wenn du den Fehler zeigen würdest. In diesem Fall machst du zwei Dinge falsch. Erst deine Faltung muss durch drei oder die Länge des gleitenden Durchschnitts geteilt werden. Zweitens bemerken Sie die Größe von c Sie können nicht einfach passen c in a Die typische Art, einen gleitenden Durchschnitt zu bekommen wäre, dasselbe zu verwenden. Aber das sieht nicht so aus, was Sie wollen. Stattdessen sind Sie gezwungen, ein paar Zeilen zu verwenden MovAv m siehe auch movAv2 - eine aktualisierte Version, die Gewichtung erlaubt. Description Matlab enthält Funktionen namens movavg und tsmovavg Zeitreihe gleitender Durchschnitt in der Financial Toolbox, movAv ist entworfen, um die grundlegende Funktionalität dieser zu replizieren Der Code hier bietet ein schönes Beispiel für die Verwaltung von Indizes Innere Schleifen, die verwirrend sein können, um mit I ve bewusst gehalten den Code kurz und einfach, um diesen Prozess klar. movAv führt einen einfachen gleitenden Durchschnitt, die verwendet werden können, um laute Daten in einigen Situationen wiederherzustellen Es funktioniert, indem sie einen Mittelwert von Die Eingabe y über ein gleitendes Zeitfenster, dessen Größe durch n spezifiziert ist. Je größer n ist, desto größer ist die Größe der Glättung der Wirkung von n ist relativ zur Länge des Eingangsvektors y und wirksam gut, die Art von schafft a Tiefpass-Frequenz-Filter - siehe die Beispiele und Überlegungen Abschnitt. Weil die Menge der Glättung von jedem Wert von n ist relativ zu der Länge des Eingangs-Vektor, es ist immer wert testen verschiedene Werte zu sehen, was s geeignet Denken Sie auch, dass n Punkte sind Verlor in jedem Durchschnitt, wenn n 100 ist, die ersten 99 Punkte des Eingangsvektors don t enthalten genügend Daten für einen 100pt Durchschnitt Dies kann durch Stapeln von Mitteln etwas vermieden werden, zum Beispiel der Code und das Diagramm unten vergleichen eine Anzahl von verschiedenen Längenfenster Im Durchschnitt Beachten Sie, wie glatt 10 10pt mit einem einzigen 20pt Durchschnitt verglichen wird. In beiden Fällen sind 20 Datenpunkte insgesamt verloren. Erstellen Sie xaxis x 1 0 01 5 erzeugen Rauschen Rauschen 4 Rauschen repmat randn 1, ceil numel x noiseReps, noiseReps, 1 Rauschen Reshape Rauschen, 1, Lärm Lärm Raps erzeugen ydata Rauschen y exp x 10 Rauschen 1 Länge x Perfrom Mittelwerte y2 movAv y, 10 10 pt y3 movAv y2, 10 10 10 pt y4 movAv y, 20 20 pt y5 movAv y, 40 40 pt y6 movAv y, 100 100 pt Plot Abbildung Plot x, y, y2, y3, y4, y5, y6 Legende Raw Daten, 10pt gleitender Durchschnitt, 10 10pt, 20pt, 40pt, 100pt xlabel x ylabel y title Vergleich der bewegten Durchschnitte. movAv m Code Durchlauffunktion Ausgang movAv y, n Die erste Zeile definiert die Funktion s Name, Ein - und Ausgänge Die Eingabe X sollte ein Vektor von Daten sein, um den Durchschnitt einzutragen, n sollte die Anzahl der Punkte sein, um den Durchschnitt über die Ausgabe auszuführen, wird die gemittelten Daten enthalten, die von der Funktion zurückgegeben werden. Vorausgabe der Ausgabeausgabe NaN 1, numel y Find mid point von n midPoint round N 2 Die Hauptarbeit der Funktion erfolgt in der for-Schleife, aber vor dem Start werden zwei Dinge vorbereitet. Zuerst wird die Ausgabe als NaNs vorab zugewiesen, dies bediente zwei Zwecke Zuerst ist die Vorveröffentlichung in der Regel gute Praxis, da sie das Gedächtnis-Jonglieren reduziert, das Matlab hat Zu tun, zweitens macht es sehr einfach, die gemittelten Daten in eine Ausgabe zu bringen, die die gleiche Größe wie der Eingangsvektor hat. Dies bedeutet, dass die gleiche Xaxis später für beide verwendet werden kann, was für das Plotten bequem ist, alternativ können die NaNs später entfernt werden In einer Zeile des Codeausgangsausgangs. Der variable midPoint wird verwendet, um die Daten im Ausgangsvektor auszurichten. Wenn n 10, 10 Punkte verloren gehen, weil für die ersten 9 Punkte des Eingangsvektors gibt es nicht genügend Daten zu nehmen Ein 10-Punkt-Mittelwert Da der Ausgang kürzer als der Eingang ist, muss er ordnungsgemäß ausgerichtet werden. Der MidPoint wird so verwendet, dass ein gleicher Datenbetrag am Anfang und am Ende verloren geht und der Eingang mit dem Ausgang des NaN übereinstimmt Puffer, die bei der Vorveröffentlichung der Ausgabe erzeugt werden. für eine 1-lage y - n Find-Index-Bereich, um den Durchschnitt über den Durchschnitt zu nehmen Berechnen Sie die mittlere Ausgabe ein midPoint-Mittelwert yab-Ende In der for-Schleife selbst wird ein Mittelwert über jedes aufeinanderfolgende Segment des Eingangs übernommen. Die Schleife läuft Für a, die als 1 bis zur Länge des Eingangs y definiert ist, abzüglich der Daten, die verloren gehen werden n Wenn die Eingabe 100 Punkte lang ist und n 10 ist, läuft die Schleife von einem 1 bis 90. Dies bedeutet, dass a liefert Der erste Index des zu gemittelten Segments Der zweite Index b ist einfach ein n-1 also bei der ersten Iteration ein 1 n 10 so b 11-1 10 Der erste Durchschnitt wird über yab oder x 1 10 übernommen. Der Durchschnitt davon Segment, das ein einzelner Wert ist, wird in der Ausgabe bei Index a midPoint oder 1 5 6 gespeichert. Bei der zweiten Iteration a 2 b 2 10-1 11 wird also der Mittelwert über x 2 11 übernommen und im Ausgang 7 gespeichert Letzte Iteration der Schleife für eine Eingabe der Länge 100, a 91 b 90 10-1 100, so dass der Mittelwert über x 91 100 übernommen und im Ausgang 95 gespeichert wird. Damit bleibt die Ausgabe mit insgesamt n 10 NaN-Werten bei Index 1 5 und 96 100.Beispiele und Überlegungen Bewegliche Mittelwerte sind in einigen Situationen nützlich, aber sie sind nicht immer die beste Wahl Hier sind zwei Beispiele, wo sie nicht unbedingt optimal sind. Mikrofonkalibrierung Dieser Satz von Daten repräsentiert die Niveaus jeder Frequenz, die von einem Lautsprecher und erzeugt wird Aufgezeichnet durch ein Mikrofon mit einer bekannten linearen Antwort Der Ausgang des Lautsprechers variiert mit der Frequenz, aber wir können diese Variation mit den Kalibrierdaten korrigieren - die Ausgabe kann in der Höhe angepasst werden, um die Schwankungen der Kalibrierung zu berücksichtigen Daten sind verrauscht - das bedeutet, dass eine kleine Frequenzänderung eine große, unberechenbare Änderung der Ebene zu berücksichtigen ist, ist dies realistisch oder ist dies ein Produkt der Aufzeichnungsumgebung Es ist in diesem Fall sinnvoll, einen gleitenden Durchschnitt anzuwenden Glättet die Pegel-Frequenz-Kurve, um eine Eichkurve zu liefern, die etwas weniger unregelmäßig ist. Aber warum ist das nicht optimal in diesem Beispiel. Mehrere Daten wären besser - Mehrere Kalibrierungen laufen gemittelt zusammen würden das Rauschen im System zerstören, solange es zufällig ist Und bieten eine Kurve mit weniger subtilen Detail verloren Der gleitende Durchschnitt kann nur annähernd dies, und kann einige höhere Frequenz Dips und Peaks aus der Kurve, die wirklich existieren zu entfernen. Sine Wellen Mit einem gleitenden Durchschnitt auf Sinus Wellen hebt zwei Punkte. Die allgemeine Frage Der Wahl einer vernünftigen Anzahl von Punkten, um den Durchschnitt über. It s einfach, aber es gibt effektivere Methoden der Signalanalyse als Mittelung oszillierende Signale im Zeitbereich. In diesem Diagramm ist die ursprüngliche Sinuswelle in blau aufgezeichnet Lärm wird hinzugefügt Und gezeichnet als die orange Kurve Ein gleitender Durchschnitt wird bei verschiedenen Punkten von Punkten durchgeführt, um zu sehen, ob die ursprüngliche Welle wiederhergestellt werden kann 5 und 10 Punkte liefern vernünftige Ergebnisse, aber don t entfernen das Lärm ganz, wo, wie eine größere Anzahl von Punkten beginnen zu verlieren Amplitude Detail, wie der Durchschnitt erstreckt sich über verschiedene Phasen erinnern die Welle oscilates um Null, und bedeuten -1 1 0.Ander alternativer Ansatz wäre, um ein Tiefpass-Filter zu konstruieren, als auf das Signal im Frequenzbereich angewendet werden kann ich nicht gehen Ins Detail, da es über den Rahmen dieses Artikels hinausgeht, aber da das Rauschen eine wesentlich höhere Frequenz als die Wellen-Grundfrequenz ist, wäre es in diesem Fall ziemlich einfach, einen Tiefpassfilter zu konstruieren, als das Hochfrequenzrauschen zu entfernen. A movmean A , K gibt ein Array von lokalen k-Punkt-Mittelwerten zurück, wobei jeder Mittelwert über ein Schiebefenster der Länge k über benachbarte Elemente von A berechnet wird. Wenn k ungerade ist, wird das Fenster um das Element in der aktuellen Position zentriert, wenn k gerade ist , Wird das Fenster um die aktuellen und vorherigen Elemente zentriert Die Fenstergröße wird automatisch an den Endpunkten abgeschnitten, wenn es nicht genügend Elemente gibt, um das Fenster zu füllen Wenn das Fenster abgeschnitten wird, wird der Durchschnitt nur über die Elemente übernommen, die das Fenster füllen Die gleiche Größe wie A. If A ist ein Vektor, dann bewegt sich Movmean entlang der Länge des Vektors. Wenn A ein multidimensionales Array ist, dann bewegt man movmean entlang der ersten Array-Dimension, deren Größe nicht gleich 1.M movmean A, kb kf ist Berechnet den Mittelwert mit einem Fenster der Länge kb kf 1, das das Element in der aktuellen Position enthält, kb Elemente rückwärts und kf Elemente vorwärts. M movmean, dim gibt das Array von gleitenden Durchschnitten entlang Dimension Dim für eine der vorherigen Syntaxen zurück , Wenn A eine Matrix ist, dann bewegt sich die Bewegung A, k, 2 entlang der Spalten von A, indem sie das k - Element-Gleitmittel für jeden Schritt berechnet. M movmean, nanflag spezifiziert, ob NaN-Werte aus der Berechnung für irgendwelche der Vorherige syntaxe movmean A, k, includenan schließt alle NaN-Werte in die Berechnung ein, während movmean A, k, omitnan sie ignoriert und den Mittelwert über weniger Punkte berechnet. M movmean, Name, Wert spezifiziert zusätzliche Parameter für den gleitenden Durchschnitt mit einem oder mehreren Namen - Wert-Paar-Argumente Wenn z. B. x ein Vektor von Zeitwerten ist, dann berechnet movmean A, k, SamplePoints, x den gleitenden Durchschnitt relativ zu den Zeiten in x. Wählen Sie Ihr Land.

No comments:

Post a Comment