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.