Question

Je veux transposer une matrice, son une tâche très facile, mais sa ne fonctionne pas avec moi:

UPDATE

Je transpose la première matrice et    stocker dans un second  Les deux    réseaux point à la même structure je    ont besoin de deux tableaux (source et cible)    afin que je puisse les afficher plus tard pour    comparaison.

struct testing{
  int colmat1;
  int rowmat1;
  float mat[64][64];
};

int testtranspose(testing *test,testing *test2){
  int i,j;
  test2->colmat1 = test->rowmat1;
  test2->rowmat1 = test->colmat1
  for(i=0;i<test->rowmat1;i++){
    for(j=0;j<test->colmat1;j++){
      test2->mat[i][j] = test->mat[i][j];
    }
    printf("\n");
  }
}

Je pensais que c'est la bonne méthode de le faire, mais apparemment pour une matrice telle que:

1 2
3 4
5 6
7 8

J'obtenir:

1 2 0 0
3 4 0 0

Quel est le problème?

S'il vous plaît aide, Merci!

Était-ce utile?

La solution

Transposer la matrice, vous devez les lignes de changement et de colonnes. Donc, vous devez utiliser:

targetMatrix[i][j] = sourceMatrix[j][i];

Notez comment l'ordre de i, j est changé, puisque l'une des lignes de la matrice sont une autre est colonnes.

Par ailleurs, au lieu de (*a).b, vous pouvez écrire a->b. Ceci est la façon normale d'accéder à un champ d'un pointeur struct.

Autres conseils

Essayez ceci ...

   struct testing{
  int colmat;
  int rowmat;
  float mat[64][64];
};

int testtranspose(testing *test,testing *test2){
  int i,j;
  test2->colmat = test->rowmat;
  test2->rowmat = test->colmat;
  for(i=0;i<test->rowmat;i++){
    for(j=0;j<test->colmat;j++){
      test2->mat[j][i] = test->mat[i][j];
    }
  }
  return 0;
}
int printmat(testing* mat)
{
    for(int i=0;i<mat->rowmat;i++)
    {
        printf("\n");
        for(int j=0;j<mat->colmat;j++)
            printf(("  %f"),mat->mat[i][j]);
    }
    return 0;
}

            // 2
// main.cpp
int _tmain(int argc, _TCHAR* argv[])
{
    testing mat1, mat2;
    memset(&mat1,0,sizeof(testing));
    memset(&mat2,0,sizeof(testing));
    mat1.colmat =2;
    mat1.rowmat =3;
    for(int i=0;i<mat1.rowmat;i++)
    {
        for(int j=0;j<mat1.colmat;j++)
            mat1.mat[i][j] = (float)rand();
    }
    printmat(&mat1);
    testtranspose(&mat1,&mat2);
    printmat(&mat2);
    getchar();

}

Je suis nouveau à C / C ++ (3e jour ou :)) et moi avons eu le même problème. Mon approche était légèrement différente que je pensais que ce serait bien d'avoir une fonction qui renvoie une matrice transposée. Malheureusement, comme je l'ai découvert, vous ne pouvez pas retourner un un tableau, ni passer un tableau à une fonction en C ++ (et encore moins un double tableau), mais vous pouvez passer / renvoyer un pointeur qui fonctionne de manière similaire à un tableau. Voilà donc ce que je l'ai fait:

int * matrix_transpose(int * A, int A_rows, int A_cols){
    int * B;
    int B_rows, B_cols;
    B_rows = A_cols; B_cols= A_rows;
    B = new int [B_rows*B_cols];
    for(int i=0;i<B_rows;i++){
        for(int j=0;j<B_cols;j++){
            B[i*B_cols+j]=A[j*A_cols+i];
        }
    }
    return B;
};

L'astuce était dans des tableaux de dynamiques. Je A_rows et B_rows comme noms séparés (vous pouvez utiliser uniquement les lignes et CLO) afin de rendre le problème moins complexe et moins de confusion lorsque le code de lecture.

B = new int [rows*cols] // This is cool in C++.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top