2011-05-06 3 views
1

Je ne suis pas sûr si cette question a été soit demandé ou peut-être déjà répondu. Si je commence par une matrice 3x3 d'origine:reflètent en diagonale une matrice

 
    1 2 3 
    4 5 6 
    7 8 9 

, comment pourrais-je produire la matrice 3x3 suivante:

 
    9 6 3 
    8 5 2 
    7 4 1 

??

+0

Voulez-vous dire la matrice transpose? (Si oui, ma réponse le fait) Vous dites que la diagonale reste la même mais votre exemple montre le contraire. – Pepe

+1

La diagonale principale est celle qui va de la partie supérieure gauche à la partie inférieure droite. "Refléter" autour de la diagonale principale s'appelle _transposing_ la matrice. La diagonale à laquelle vous réfléchissez (celle qui va de la partie inférieure gauche à la partie supérieure droite) s'appelle la diagonale _antidiagonale ou secondaire. –

Répondre

3

Puisque vous essayez de réfléchir sur la diagonale secondaire (ce n'est pas la transposition), voici le code, une copie légèrement modifiée de Peter:

for (int i = 0; i < n; i++) 
{ 
    for (int j = 0; j < i; j++) 
    { 
     int temp = a[i][j]; 
     a[i][j] = a[n - 1 - j][n - 1 - i]; 
     a[n - 1 - j][n - 1 - i] = temp; 
    } 
} 
+1

Merci beaucoup; Je transpose sur la diagonale secondaire parce que je crée un contre-exemple 13x13 Ramsey Number R (4,4) en utilisant l'ordinateur au lieu de la main; J'avais besoin de le refléter, donc mon algorithme de test va découvrir les matrices mal produites. Merci! –

+0

Si cela répond à votre question, cliquez sur la coche à côté de la réponse.C'est ce qu'on appelle «accepter la réponse», et c'est ainsi que nous disons «merci» ici à StackOverflow. Oh, et bienvenue à SO. –

+0

@ Steve314: vous avez raison. Désolé, foiré. –

3

Pour une réflexion, des paires d'éléments dans la matrice sont échangés, de sorte que le "faire quelque chose" (dans les boucles) sera une opération d'échange. Les boucles seront utilisées pour sélectionner un objet à échanger, et une arithmétique de base est utilisée pour choisir l'objet avec lequel l'échanger. Les boucles doivent parcourir le triangle des éléments qui sont d'un côté de l'axe pour réfléchir autour, excluant ceux sur l'axe de réflexion et de l'autre côté de celui-ci. Pour visualiser cela ...

0 1 2 
0 * */
1 */. 
2/. . 

Les astérisques sont les éléments à utiliser comme premiers paramètres pour le swap. Les points sont les éléments à utiliser en tant que seconds paramètres du swap. Les barres obliques sont sur l'axe de réflexion.

... Par conséquent

for (int i = 0; i < 2; i++) 
{ 
    for (int j = 0; j < (n-1)-i; j++) // Thanks to Bugaboo for bugfix 
    { 
    std::swap (a[i][j], a[2-j][2-i]); 
    } 
} 

Avec une matrice 3x3, les boucles sont un peu trop - ils sont présentés ici pour le principe et pour montrer comment l'étendre. Il n'y a que trois astérisques dans cette visualisation, et seulement trois opérations de swap nécessaires ...

std::swap (a[0][0], a[2][2]); 
std::swap (a[0][1], a[1][2]); 
std::swap (a[1][0], a[2][1]); 
+1

Avec votre code, comment arrivez-vous à A [0] [0]? Puisque 'j' est contraint à être toujours inférieur à 'i', les deux ne peuvent jamais être égaux en même temps. La restriction correcte sur 'j' est j Bugaboo

+0

@Bugaboo - une erreur stupide - ma boucle originale implémenterait une transposition autour de la diagonale majeure, pas la réflexion requise autour de la diagonale secondaire. En regardant l'histoire de la réponse, je me suis même référé à quelqu'un d'autre pour dire qu'il était confus au sujet de quelle opération il mettait en œuvre - oups. – Steve314

2

Pour une matrice N * N carré:

for(int i=0;i<n-1;i++) 
     for(int j=0;j<n-1-i;j++) //Swap elements above anti-diagonal 
      std::swap(mat[i][j],mat[n-1-j][n-1-i]); //with elements below it 
0

Je pense avoir trouvé un chemin dans le Matlab combine une série d'autres méthodes de retournement existantes.

  1. fliplr (flip gauche et droite)
  2. transposition
  3. fliplr

Ham est la cible alors le code est le suivant.
Peut-être que c'est faux, mais faites le moi savoir.

fliplr(fliplr(Ham)') 
Questions connexes