Comment transposer une matrice 2D en place? P>
8 Réponses :
for (int i=0; i<n; i++) {
for (int j=0; j<i; j++) {
temp = a[i][j];
a[i][j] = a[j][i];
a[j][i] = temp;
}
}
ATTENTION! Ceci n'est que correct pour les tableaux carrés. Voir le lien Wikipedia de DLB ci-dessous pour une mise en œuvre de matrice non carrée.
Vous n'avez pas spécifié une langue, mais généralement, ce que vous faites est:
let a be your array. for each i,j with i<j switch a[i,j] with a[j,i]
Cela aussi n'est que correct pour une matrice carrée. Gestion des matrices non carrées est étonnamment difficile.
Pour obtenir la transposition d'une matrice carrée, nous devons envisager des éléments au-dessus de la diagonale principale ou inférieure à celle-ci et échanger chacun avec sa réflexion le long de la diagonale principale:
Pourquoi déranger? Juste échanger des indices dans n'importe quel énoncé d'accès. P>
Il y a une pénalité de performance grave pour accéder aux tableaux 2D dans le «mauvais» ordre - il est souvent préférable de payer le prix d'une transposition afin de tirer parti des avantages de l'accès à la mémoire contiguë (Stride de l'unité).
Wikipedia avait une transposition de matrice d'article sur place. L'article couvre les matrices non carrées. p>
http://en.wikipedia.org/wiki/in-pléric_matrix_transposition < / p>
Cela semble bien fonctionner:
function transpose(a)
{
return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
}
in c # Le résultat est dans des objets p> p>
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(i!=j && j>i)
{
temp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
}
(N is the size of your array)
carré ou pas? Ça fait une grande différence
@AAA: La transposition d'une matrice non carrée en place n'a pas beaucoup de sens.
Bien que, selon la représentation (par exemple, en utilisant un seul tableau de dimensions N * M), cela pourrait être fait.
C'était à peu près "battu à mort" dans Ce message a>
@Jens Cela donne beaucoup de sens si vous stockez toutes les données matricielles dans un seul tableau.