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.

War es hilfreich?

Lösung

Wenn alle Ihre Matrizen wirklich Kopien ("Replikate") des ersten sind (nennen Sie es mat18), für dein nDer 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top