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]);
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
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. –