6
votes

Comment transposer une matrice multidimensionnelle en place

Comment transposer une matrice 2D en place?


5 commentaires

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


@Jens Cela donne beaucoup de sens si vous stockez toutes les données matricielles dans un seul tableau.


8 Réponses :


6
votes
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;
  }
}

1 commentaires

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.



4
votes

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]


1 commentaires

Cela aussi n'est que correct pour une matrice carrée. Gestion des matrices non carrées est étonnamment difficile.



2
votes

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: xxx


0 commentaires

0
votes

Pourquoi déranger? Juste échanger des indices dans n'importe quel énoncé d'accès.


1 commentaires

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é).




-1
votes

Cela semble bien fonctionner:

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


0 commentaires

0
votes

in c # xxx

Le résultat est dans des objets


0 commentaires

1
votes
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)

0 commentaires