Wie zyklische Elemente durch jeden Index von Patches einer Matrix, ohne explizit durch jeden Patch zu iterieren?Circular shift von Patches in Matrix in MATLAB
Die iterative Weise, die ich denken kann dieses Radfahren auszuführen ist mit circshift
Funktion des MATLAB. Ich könnte durch jeden MxN-Patch in meiner Matrix iterieren 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 machen. Mit einer Matrix, nur Vektorisieren, verschieben und umformen, zurücknehmen Vorteil der MATLAB-Spalte-major lineare Indexierung)
Das wäre toll, wenn ich durch jedes MxN-Fenster meiner größeren (j * M xk * 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 irgendeiner Matrix B) wäre:
B = --> B = --> B = --> B =
[ 5 6 7 8 ] --> [ 5 6 7 8 ] --> [ 6 5 8 7 ] --> [ 6 5 8 7 ]
[ 5 6 7 8 ] --> [ 6 5 8 7 ] --> [ 6 5 8 7 ] --> [ 5 6 7 8 ]
[ 5 6 7 8 ] --> [ 5 6 7 8 ] --> [ 6 5 8 7 ] --> [ 6 5 8 7 ]
[ 5 6 7 8 ] --> [ 6 5 8 7 ] --> [ 6 5 8 7 ] --> [ 5 6 7 8 ]
Irgendwelche Ideen, wie man diese Schichtarbeit machen, ohne durch jeden Patch explizit laufen? 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 zu demonstrieren, was ich suche. Die einzigen für Schleife, die in einer Antwort enthalten sein sollen, ist der k
-iterator (steuert, wie viele Schichten letztlich gemacht werden müssen)
A = repmat(1:4, 4, 1); % Input matrix
% k represents the total number of shifts to be made
for k = 1:4
% Iterate through each patch
for i = 1:2:size(A,1)
for j = 1:2:size(A,2)
tmp = A(i:i+1,j:j+1); % Isolate specific patch
% Circularly shift the vectorized patch, reshape it to a matrix
% and insert it back into the original matrix
A(i:i+1,j:j+1) = reshape(circshift(tmp(:),1), 2, 2);
end
end
display(A) % Display each completely shifted iteration
end
Es ist eine interessante Frage. Sie können grundsätzlich berücksichtigen, dass alles, was Sie wollen, getan werden kann. Aber zumindest bin ich nicht motiviert, darüber nachzudenken, wie Ihr Input und Output gestaltet werden sollte. Bitte posten Sie Ihre exakten Eingaben, die zum Kopieren und Einfügen bereit sind, und die Ausgabe, die Sie für diese Eingabe erhalten möchten (auch bereit zum Kopieren und Einfügen). Es gibt viele Dinge zu klären. z.B. Magst du Zellenarrays als Ausgabe? oder 3D-Matrizen? – thewaywewalk
@thewaywewalk Ich habe ein Spielzeugbeispiel für Copy/Paste hinzugefügt, das hoffentlich zeigen soll, wonach ich suche. Die Ausgabe sollte eine Matrix mit den gleichen Dimensionen wie die Eingabe sein. Ich möchte Zellenarrays vermeiden, wenn sie nicht einfach zurückkonvertiert werden können. Ich habe darüber nachgedacht, auch Zellen-Arrays zu verwenden, weil sie nützlich sind, um eine Matrix in Blöcke zu zerlegen, aber selbst damit hilft es nicht, die Verschiebung so weit zu machen, wie ich es beurteilen kann. – marcman