2016-06-10 21 views
0

berechnen Ich habe eine Zeitreihendaten oder unter Berücksichtigung einer realen Daten der Länge N. Ich möchte Unterblöcke der Länge k erstellen, die die Fensterlänge ist. Der Wert k kann beliebig gewählt werden. Dies erzeugt ein Problem, da die Fenstergröße über die Daten hinweg gleich ist. Ich möchte jeden Unterblock in einem Array speichern. Aber ich bin stecken in der Erstellung von Teilblöcken der Daten und eine Überprüfung, so dass die (mod(N, nseg))nseg durch die Datenlänge teilbar sein muss.Mittelwert über ein gleitendes Fenster in MATLAB

N = 512; %length of the time series 
data = rand(N,1); 
window_length = 30; %k 
Nseg = floor(N/window_length) %Number of segments or blocks 

Modified_Data = [mean(reshape(data,window_length,Nseg))]; %Throws error 

Antwort

2

Wenn Sie das Image Processing Toolbox haben könnten Sie im2col verwenden, um eine bestimmte Blockgröße über die gesamte Zeitreihe zu gleiten. Jede Spalte der Ausgabe repräsentiert die Daten von einem dieser Blöcke.

values = im2col(data, [window_length 1], 'distinct'); 

Da es sieht aus wie Sie nur den Mittelwert über jeden Block möchten, können Sie auch blockproc dies zu tun verwenden.

means = blockproc(data, [window_length, 1], @(x)mean(x.data)); 

Wenn Sie nicht das Image Processing Toolbox haben, können Sie stattdessen accumarray verwenden diese Aufgabe auszuführen.

means = accumarray(floor((0:(N-1)).'/window_length) + 1, data, [], @mean); 

Wenn Sie Daten verwerfen, die über eine Reihe erstreckt, die durch window_length teilbar ist, können Sie dies tun, mit etwas wie folgt aus:

data = data(1:(numel(data) - mod(numel(data), window_length))); 

Wenn Sie überlappende Daten möchten, können Sie‘ ll entweder wollen straight-up Faltung (die bevorzugte Methode)

means = conv(data(:), ones(5, 1)/5, 'same'); 

verwenden, oder Sie können durch Weglassen des l mit im2col überlappende Blöcke erstellen ast Eingabe.

values = im2col(data, [window_length 1]); 
means = mean(values 1); 
+0

Vielen Dank für Ihre Antwort. Ich habe die Funktion im2col(). Ich würde gerne wissen, dass ich neben dem Erstellen nicht überlappender Blockgrößen auch die Methode anwenden kann, um überlappende Blöcke zu erstellen. Ich möchte nicht den Mittelwert über das gleitende Fenster für die Überlagerung. Lassen Sie die Daten enthalten 5 Elemente sagen Daten = [1,2,3,4,5]. Dann wären die Blöcke blck1 = (0,1); blk2 = (1,2); blk3 = (2,3); blk4 = (3,4); blk5 = (4,5)? Könnten Sie bitte eine Antwort auf Nichtüberschneidungen (die, die Sie bereits haben) und den sich überschneidenden Fall, den ich in diesem Kommentar erwähnt habe, vorlegen? Vielen Dank! –

+0

Sie möchten nur den dritten Eingang von 'im2col' weglassen:' im2col ([1 2 3 4 5], [1 2]) ' – Suever

+0

@SrishtiM Aktualisiert. – Suever

0

Wenn ich Ihre Frage richtig verstanden habe, ist es ziemlich einfach:

filter(ones(N,1)/N,1,signal) 

Wenn man darüber nachdenkt, mit Filtern [1/N 1/N 1/N ... 1/N] ist genau die lokalisierte mittlere Berechnung ...

+0

Es sieht so aus, als wollten sie keine überlappenden Blöcke ... – Suever

+0

@Sie können einfach alle 'N' Elemente des Ergebnisses auswählen.Sonst ist "conv" hier einfacher als 'filter', vielleicht sind sie für den Kernel gleich, aber' conv' gibt dir definitiv die Mittel – Dan

+0

whoops, weiß nicht, wie ich diesen Teil in der Frage verpasst habe. . –

2

Wenn Sie R2016a + haben, betrachten die movmean Funktion in integrierten mit:

N = 512; %length of the time series 
data = rand(N,1); 
window_length = 30; %k 
Modified_Data = movmean(data, window_length); 

Weitere Informationen und weitere Optionen finden Sie in der Dokumentation.

Verwandte Themen