Question

Je suis tout à fait nouveau à la programmation si je cherche quelques experts me poussent du coude dans la bonne direction que je termine cet exercice.

J'ai utilisé horzcat et vertcat faire manuellement, mais je me demande si quelqu'un sait d'une manière plus simple.

Matrice 1 est 18x18 et indexé à partir horizontalement à 1.

Matrice 1 est au centre et représente un espace discret. Matrice 2,3,4,5,6,7,8,9 sont des essais répétés de la matrice 1, représentent également des espaces discrets et sont situés à droite, en bas à droite, en bas, en bas à gauche, à gauche, en haut à gauche, en haut et en haut à droite.

Matrice 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 sont réplique également d'une matrice et d'entourer la matrice 2 à 9. Les matrices construit forment ensemble un motif comme ci-dessous. Chaque matrice est elle-même une unité discrète.

Si vous définissez le nombre de matrices dont vous avez besoin, donc disons que dans ce cas « 49 » ou « 4 étapes de la matrice 1 » (une personne peut passer de 1, 9, 25, 49 sur une diagonale ou 1, 8 , 23,46 sur une ligne droite), comment puis-je construire les matrices dans ce modèle?

                      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     

Si je montre ce diagramme, je l'espère, je peux mieux exprimer mon problème.

La première bague est la suivante:

                               7 8 9
                               6 1 2
                               5 4 3

le deuxième anneau est la suivante:

                       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

le troisième anneau est

                  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

et ainsi de suite. Je voudrais pouvoir continuer ce modèle à l'infini.

Quelle est la meilleure façon de le faire dans Matlab?

Je présente mes excuses pour mon manque de clarté et la nécessité de mieux exprimer mon problème. Tous vos commentaires sont très utiles pour me montrer comment écrire un problème approprié.

Merci beaucoup pour votre aide les gars. Juste rejoint ce forum que le soutien ici est exceptionnel.

Était-ce utile?

La solution

Si toutes vos matrices sont vraiment des copies ( « réplicats ») de l'initiale (appeler mat18), pour votre étape nth vous pouvez simplement appeler

largemat=repmat(mat18, 2*n+1, 2*n+1);

par exemple.

largemat=repmat(mat18, 7,7);

pour produire la matrice que vous avez décrit dans votre exemple. Comme le dit Clément, cela crée la grande matrice directement, et non en élargissant un.

Mise à jour 2

Si vos matrices sont différentes , par exemple, vous avez 49 matrices stockées dans un de réseau de cellules de mymatrices{1}, mymatrices{2}, ... mymatrices{49}, vous commencez par

largemat{1}=mymatrices{1};

pour calculer la prochaine largemat{n+1} de mymatrices et largemat{n}, vous devez ajouter les prochains mymatrices « autour » du largemat{n}. largemat{n} contient déjà les premières matrices de m^2 avec m=2*n+1, vous aurez donc besoin mymatrices{(m^2+1):((m+2)^2)} et les disposer correctement:

et puis à chaque étape agrandir

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

Pour tester ce code , permet d'utiliser des numéros de simples pour vos sous-matrices:

mymatrices=mat2cell(1:49,1,ones(1,49));

Maintenant, nous pouvons exécuter le code ci-dessus dans une boucle, l'impression des résultats intermédiaires pour vérifier:

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

qui imprime

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

Pour tester cela fonctionne aussi pour les matrices d'entrée non scalaires, utilisez

mymatrices=cell(1,49);
for i=1:49,mymatrices{i}=rand(9,9),end;

en entrée, qui ne se bloque pas ... même si je n'ai pas vérifié manuellement que la matrice résultante est correcte; -).

Autres conseils

Il est probablement plus simple d'écrire une fonction qui génèrent toute votre matrice pour un nombre donné de couches au lieu d'essayer de développer une matrice existante par une nouvelle couche.

scroll top