Kreisförmige Verschiebung von Patches in Matrix in MATLAB

9

Wie zyklische Elemente durch jeden Index von Patches einer Matrix, ohne explizit durch jeden Patch zu iterieren?

Der iterative Weg, wie ich dieses Rad fahren kann, ist die MATLAB-Funktion circshift . Ich könnte jeden MxN-Patch in meiner Matrix durchlaufen und eine kreisförmige Verschiebung der Elemente dieses Patches ausführen.

(HINWEIS: circshift nimmt ein Array und verschiebt den ersten (oder k-ten) Index nach hinten, verschiebt alles nach vorne, um Platz zu schaffen. Mit einer Matrix wird es einfach vektorisiert, verschoben und zurückverformt. Nutzen der MATLAB-Spalte-Hauptlinearindizierung)

Das wäre großartig, wenn ich jedes MxN-Fenster meiner größeren (j * M x k * N für ganze Zahlen j, k) -Matrix durchlaufen würde. Ich möchte jedoch in der Lage sein, for-Schleifen zu vermeiden und den vektorisierten Code von MATLAB dazu zu nutzen, dies auf einen Schlag zu tun.

Eine vollständige Iteration durch ein Beispiel (2x2 Patches in einer Matrix B) wäre:

%Vor%

Irgendwelche Ideen, wie man diese Schicht ohne explizite Wiederholung jedes Patches machen kann? Ich habe das Gefühl, dass lineare Indexierung hier der Schlüssel ist, aber ich bin mir nicht sicher warum. Ich interessiere mich auch nicht für die Reihenfolge der Rotation, solange jedes Patch-Element in jedem Patch-Index endet.

Vielen Dank im Voraus!

EDIT: Hier ist eine Kopie-und-Einfügen-fähige Spielzeug-Implementierung mit for-Schleifen, um zu demonstrieren, wonach ich suche. Die einzige for-Schleife, die in einer Antwort enthalten sein sollte, ist der k -iterator (steuert, wie viele Schichten letztendlich vorgenommen werden müssen)

%Vor%     
marcman 02.05.2015, 04:26
quelle

1 Antwort

2

Eine einfache Möglichkeit wäre, die Funktion blockproc aus der Bildverarbeitung zu verwenden Werkzeugkasten. blockproc unterteilt ein Bild (oder allgemein eine Matrix) in Blöcke definierter Größe und wendet eine Funktion auf jeden dieser Blöcke an:

%Vor%

Mit blockproc können wir die Matrix A in 2 x 2 -Felder aufteilen und die kreisförmige Verschiebung auf jeden dieser Patches anwenden. Beachten Sie, dass blockproc einen block_struct -Datentyp erstellt und fun(block_struct) aufruft. Um die Daten zu erhalten, verwenden Sie einfach das data -Feld der Struktur. Dies wird zu

führen %Vor%

Oder mit dem mitgelieferten Beispielcode:

%Vor%

erzeugt die gewünschte Ausgabe

%Vor%

Sie können auch definieren, wie Fälle zu behandeln sind, in denen die Matrix nicht in 2 x 2 Blöcke aufgeteilt werden kann, z. wenn es die Dimension 5 x 7 hat (wie in Kommentaren erwähnt). Wenn% ce_de% auf "true" gesetzt wird, werden alle Teilblöcke aufgefüllt, sodass sie vollständige PadPartialBlocks Blöcke bilden. Sie können die Eigenschaft 2 x 2 auf einen der folgenden Werte setzen, je nachdem, was Sie benötigen:

  • PadMethod wobei x eine Zahl ist, auf die alle zusätzlichen Punkte gesetzt werden.
  • x wiederholt die Rahmenelemente der Matrix replicate
  • A pad symmetric mit symmetrischen Reflexionen von sich selbst
hbaderts 02.05.2015, 14:59
quelle

Tags und Links