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:
bei einem chunksize
von 4 ( cs=4
) und einer Verschiebung von 2 ( sh=2
) sollte das Ergebnis wie folgt aussehen:
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.
Sie können die Funktion bsxfun
im Folgenden verwenden Art und Weise:
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ß:).
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% Haben Sie die Signalverarbeitungs-Toolbox? Dann lautet der Befehl buffer
. Sehen Sie sich zunächst die nackte Ausgabe an:
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.
Dies erreichen Sie mit ndgrid
:
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?
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:
z. Für cs=5; sh=3;
würde dies bedeuten:
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.