Replikation von Matrizen nach außen von einem zentralen Punkt nach außen
Frage
Ich bin ziemlich neu im Programmieren und suche einige Experten, die mich in die richtige Richtung schieben, wenn ich diese Übung abschließe.
Ich habe Horzcat und Vertcat verwendet, um dies manuell zu tun, aber ich frage, ob jemand einen einfacheren Weg kennt.
Matrix 1 ist 18x18 und indexiert horizontal ab 1.
Matrix 1 befindet sich in der Mitte und stellt einen diskreten Raum dar. Matrix 2,3,4,5,6,7,8,9 sind Replikate der Matrix 1, repräsentieren auch diskrete Räume und befinden sich rechts, unten rechts, unten links, links, oben links, oben und oben rechts.
Matrix 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 sind auch Replikate der Matrix 1 und Surround Matrix 2 bis 9. ein Muster wie unten. Jede Matrix ist selbst eine diskrete Einheit.
Wenn Sie die Anzahl der von Ihnen benötigten Matrizen definieren, sagen wir also in diesem Fall '49' oder '4 Schritte von Matrix 1' (eine Person kann von 1, 9, 25, 49 auf einer Diagonale oder 1, 8, 23 springen. 46 auf einer geraden Linie), wie baue ich die Matrizen in diesem Muster auf?
43 44 45 46 47 48 49
42 21 22 23 24 25 26
41 20 7 8 9 10 27
40 19 6 1 2 11 28
39 18 5 4 3 12 29
38 17 16 15 14 13 30
37 36 35 34 33 32 31
Wenn ich dies diagrammatisch zeige, hoffe ich, dass ich mein Problem besser ausdrücken kann.
Der erste Ring ist also:
7 8 9
6 1 2
5 4 3
Der zweite Ring ist Folgendes:
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
Der dritte Ring ist
43 44 45 46 47 48 49
42 21 22 23 24 25 26
41 20 7 8 9 10 27
40 19 6 1 2 11 28
39 18 5 4 3 12 29
38 17 16 15 14 13 30
37 36 35 34 33 32 31
usw. Ich möchte dieses Muster unendlich fortsetzen können.
Was ist der beste Weg, dies in Matlab zu tun?
Ich entschuldige mich für meinen Mangel an Klarheit und muss mein Problem besser ausdrücken. Alle Ihre Kommentare sind sehr nützlich, um mir zu zeigen, wie man ein richtiges Problem schreibt.
Vielen Dank für Ihre Hilfe, Leute. Bin diesem Forum gerade beigetreten, da die Unterstützung hier außergewöhnlich ist.
Lösung
Wenn alle Ihre Matrizen wirklich Kopien ("Replikate") des ersten sind (nennen Sie es mat18
), für dein n
Der Schritt, den Sie einfach anrufen konnten
largemat=repmat(mat18, 2*n+1, 2*n+1);
z.B
largemat=repmat(mat18, 7,7);
Um die in Ihrem Beispiel beschriebene Matrix zu produzieren. Wie Clement sagt, schafft dies die große Matrix direkt, nicht durch die Erweiterung eines vorhandenen.
Update 2
Wenn Ihre Matrizen unterschiedlich sind, Zum Beispiel haben Sie 49 Matrizen in a Zellarray mymatrices{1}
, mymatrices{2}
, ... mymatrices{49}
, du würdest anfangen
largemat{1}=mymatrices{1};
Nun, um den nächsten zu berechnen largemat{n+1}
aus mymatrices
und largemat{n}
, Sie müssen die nächsten Mymatrizen "um" hinzufügen largemat{n}
. largemat{n}
Enthält bereits die ersten m^2
Matrizen mit m=2*n+1
, also brauchst du mymatrices{(m^2+1):((m+2)^2)}
und ordnen Sie sie richtig an:
und dann in jedem Schritt vergrößern es es
largemat{n+1} = [ largemat{n} cell2mat(mymatrices(m^2+(1:m))')]; %# add to the right
largemat{n+1} = [ largemat{n+1} ; cell2mat(mymatrices(m^2+m+(m+1:-1:1)))]; %# add at bottom
largemat{n+1} = [ cell2mat(mymatrices(m^2+2*m+1+(m+1:-1:1))') largemat{n+1}]; %# add at right
largemat{n+1} = [ cell2mat(mymatrices(m^2+3*m+2+(1:m+2))) ; largemat{n+1}]; %# add at top
Um diesen Code zu testen, Verwenden wir einfache Zahlen für Ihre Submatrizen:
mymatrices=mat2cell(1:49,1,ones(1,49));
Jetzt können wir den obigen Code in einer Schleife ausführen und Zwischenergebnisse drucken, um zu überprüfen:
largemat{1}=mymatrices{1};
for n=1:3
m=2*n-1;
largemat{n+1} = [ largemat{n} cell2mat(mymatrices(m^2+(1:m))')]; %# add to the right
largemat{n+1} = [ largemat{n+1} ; cell2mat(mymatrices(m^2+m+(m+1:-1:1)))]; %# add at bottom
largemat{n+1} = [ cell2mat(mymatrices(m^2+2*m+1+(m+1:-1:1))') largemat{n+1}]; %# add at right
largemat{n+1} = [ cell2mat(mymatrices(m^2+3*m+2+(1:m+2))) ; largemat{n+1}]; %# add at top
largemat{n+1}
end
welche druckt
ans =
7 8 9
6 1 2
5 4 3
ans =
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
ans =
43 44 45 46 47 48 49
42 21 22 23 24 25 26
41 20 7 8 9 10 27
40 19 6 1 2 11 28
39 18 5 4 3 12 29
38 17 16 15 14 13 30
37 36 35 34 33 32 31
Um es zu testen, funktioniert es auch für nicht -Calar -Eingangsmatrizen, verwenden Sie
mymatrices=cell(1,49);
for i=1:49,mymatrices{i}=rand(9,9),end;
Als Eingabe, der nicht abstürzt ... obwohl ich nicht manuell überprüft habe, dass die resultierende Matrix korrekt ist ;-).
Andere Tipps
Es ist wahrscheinlich einfacher, eine Funktion zu schreiben, die Ihre gesamte Matrix für eine bestimmte Anzahl von Schichten generiert, anstatt zu versuchen, eine vorhandene Matrix mit einer neuen Ebene zu erweitern.