2010-04-21 3 views
6

comment transposer une matrice 2D en place?Comment transposer un tableau multidimensionnel en place

+3

carré ou non? cela fait une grande différence – Anycorn

+1

@aaa: Transposer une matrice non-carré en place n'a pas beaucoup de sens. – Jens

+2

Bien que cela dépende de la représentation (par exemple en utilisant un seul tableau de dimensions N * M), cela pourrait être fait. –

Répondre

6
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; 
    } 
} 
+2

AVERTISSEMENT! Ceci n'est correct que pour les tableaux carrés. Voir le lien Wikipedia de @ dlb ci-dessous pour une implémentation matricielle non carrée. – Mayank

4

Vous n'avez pas spécifié une langue, mais en général, 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] 
2

Pour obtenir la transposition d'une matrice carrée, nous devons tenir compte des éléments ci-dessus la diagonale principale ou au-dessous et échanger chacun avec sa réflexion sur la diagonale principale:

for i->0 to N-1 
for j->i+1 to N-1 
    swap matrix[i][j] with matrix[j][i] 
0

Pourquoi prendre la peine? Il suffit d'échanger des indices dans n'importe quelle déclaration d'accès.

+9

Il y a une sérieuse pénalité de performance pour accéder aux tableaux 2D dans le «mauvais» ordre - il est souvent préférable de payer le prix d'une transposition pour bénéficier des avantages de l'accès mémoire contigu (foulée unitaire). –

-1

Cela semble bien fonctionner:

function transpose(a) 
{ 
    return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); }); 
} 
0

en C#

string[,] Value; 
//fill Value 

//create transposed array 
ValueAux = new string[Value.GetLength(1),Value.GetLength(0)]; 
for (i = 0; i < Value.GetLength(0); i++) 
{ 
    for (j = 0; j < Value.GetLength(1); j++) 
    { 
    Valueaux[j, i] = Value[i, j]; 
    } 
} 

Le résultat est ValueAux

1
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 est la taille de votre tableau)

Questions connexes