Ich habe einen Vektor und möchte den gleitenden Durchschnitt berechnen (mit einem Fenster der Breite 5).
Wenn der fragliche Vektor beispielsweise [1,2,3,4,5,6,7,8]
ist, dann
[1,2,3,4,5]
(d. h. 15
); [2,3,4,5,6]
(d. h. 20
); Am Ende sollte der resultierende Vektor [15,20,25,30]
sein. Wie kann ich das tun?
Die Funktion conv
befindet sich direkt auf Ihrer Seite:
Drei Antworten, drei verschiedene Methoden ... Hier ist ein kurzer Benchmark (verschiedene Eingabegrößen, feste Fensterbreite von 5) mit timeit
; fühlen Sie sich frei, Löcher darin zu stoßen (in den Kommentaren), wenn Sie denken, dass es verfeinert werden muss.
conv
erscheint als der schnellste Ansatz; es ist etwa doppelt so schnell wie Münzansatz (mit filter
) und etwa viermal so schnell wie Luis Mendos Ansatz (mit cumsum
) .
Hier ist ein weiterer Benchmark (feste Eingabegröße von 1e4
, unterschiedliche Fensterbreiten). Hier stellt sich Luis Mendos Ansatz cumsum
als klarer Gewinner heraus, da seine Komplexität in erster Linie von der Länge der Eingabe bestimmt wird und ist unempfindlich für die Breite des Fensters.
Um zusammenzufassen, sollten Sie
conv
-Ansatz, wenn Ihr Fenster relativ klein ist, cumsum
, wenn Ihr Fenster relativ groß ist. Eine andere Möglichkeit besteht darin, cumsum
zu verwenden. Dieser Ansatz erfordert wahrscheinlich weniger Operationen als conv
:
Um etwas Zeit zu sparen, können Sie die letzte Zeile durch
ersetzen %Vor%Tags und Links matlab moving-average