Matlab: Vektor in überlappende Stücke fester Größe teilen

8

Ich habe einen Vektor, den ich in Schichten von cs in überlappende Subvektoren der Größe sh aufteilen möchte. Stellen Sie sich vor, der Eingabevektor ist:

%Vor%

bei einem chunksize von 4 ( cs=4 ) und einer Verschiebung von 2 ( sh=2 ) sollte das Ergebnis wie folgt aussehen:

%Vor%

Beachten Sie, dass der Eingabevektor nicht notwendigerweise durch chunksize teilbar ist und daher einige Untervektoren verworfen werden. Gibt es einen schnellen Weg, dies zu berechnen, ohne dass z.B. a for loop? In einem verwandten Post habe ich herausgefunden, wie tue das aber, wenn du nicht überlappende Subvektoren betrachtest.

    
Tin 16.12.2013, 11:22
quelle

5 Antworten

5

Sie können die Funktion bsxfun im Folgenden verwenden Art und Weise:

%Vor%

So funktioniert es. bsxfun wendet einige grundlegende Funktionen auf 2 Arrays an und führt einige repmat -like aus, wenn die Größen der Eingaben nicht passen. In diesem Fall erzeuge ich die Indizes des ersten Chunks und füge den Offset jedes Chuncks hinzu. Da eine Eingabe ein Zeilenvektor und die andere ein Spaltenvektor ist, ist das Ergebnis eine Matrix. Schließlich, wenn ein Vektor mit einer Matrix indexiert wird, ist das Ergebnis eine Matrix, genau das, was Sie erwarten.

Und es ist ein One-Liner, (fast) immer Spaß:).

    
Bentoy13 16.12.2013 13:16
quelle
2

Ich nehme an, der einfachste Weg ist eigentlich eine Schleife. Eine vektorisierte Lösung kann schneller sein, aber wenn das Ergebnis richtig vorbelegt ist, sollte die Schleife ebenfalls gut funktionieren.

%Vor%     
Dennis Jaheruddin 16.12.2013 12:15
quelle
1

Haben Sie die Signalverarbeitungs-Toolbox? Dann lautet der Befehl buffer . Sehen Sie sich zunächst die nackte Ausgabe an:

%Vor%

Das ist eindeutig die richtige Idee, mit nur ein wenig Abstimmung, um Ihnen genau die Ausgabe zu geben, die Sie wollen:

%Vor%

Denken Sie darüber nach, die Vektoren spaltenweise zu belassen, da dies den meisten Anwendungsfällen besser entspricht. Zum Beispiel ist der Mittelwert jedes Fensters nur mean der Matrix, da spaltenweise der Standardwert ist.

    
Peter 16.12.2013 15:09
quelle
1

Dies erreichen Sie mit ndgrid :

%Vor%

Das Schöne an der zweiten Syntax des colon Operators ( j:i:k ) ist, dass Sie k nicht genau berechnen müssen (zB 1:2:6 gibt [1 3 5] ), wenn Sie die zusätzlichen Einträge wie in diesem Problem verwerfen möchten. Es geht automatisch zu j+m*i , wo m = fix((k-j)/i) ;

Unterschiedlicher Test:

%Vor%

Und eine neue Zeile wird mit v=1:17 gebildet. Behandelt dies alle Fälle nach Bedarf?

    
chappjc 16.12.2013 21:30
quelle
0

Was ist damit? Zuerst erzeuge ich die Startindizes auf Basis von cs und sh , um die einzelnen Vektoren aus dem Vektor voller Länge zu schneiden, dann lösche ich alle Indizes, für die idx+cs die Vektorlänge überschreiten würde, und dann schneide ich die einzelnen Untervektoren über arrayfun auslesen und anschließend in eine Matrix umwandeln:

%Vor%

z. Für cs=5; sh=3; würde dies bedeuten:

%Vor%

Je nachdem, woher die Werte cs; sh stammen, möchten Sie wahrscheinlich eine einfache Fehlerüberprüfung einleiten, so dass cs > 0; sowie sh < cs . sh < 0 wäre theoretisch möglich, wenn Sie einige Werte dazwischen lassen möchten.

BEARBEITEN : Es wurde ein sehr kleiner Fehler behoben, der nun für verschiedene Kombinationen von sh und cs ausgeführt werden sollte.

    
tim 16.12.2013 11:41
quelle

Tags und Links