Domanda

Voglio trasporre una matrice, è un compito molto facile, ma la sua non funziona con me:

Aggiorna

Mi recepimento della prima matrice e    memorizzazione in una seconda  Il due    matrici indicano la stessa struttura io    necessità due array (origine e di destinazione)    in modo da poterli visualizzare in seguito per    confronto.

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");
  }
}

Ho pensato che questo è il metodo corretto di farlo, ma a quanto pare per una matrice come ad esempio:

1 2
3 4
5 6
7 8

I ottenere:

1 2 0 0
3 4 0 0

Qual è il problema?

Si prega di aiuto, Grazie!

È stato utile?

Soluzione

Per trasporre la matrice, è necessario righe e colonne di cambiamento. Quindi è necessario utilizzare:

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

Nota come l'ordine di i, j è cambiato, poiché le righe di una matrice sono altrui colonne.

A proposito, invece di (*a).b, è possibile scrivere a->b. Questo è il modo normale di accesso a un campo di un puntatore struct.

Altri suggerimenti

Prova questo ...

   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();

}

Sono nuovo di C / C ++ (3 ° giorno o giù di lì :)) e ho avuto lo stesso problema. Il mio approccio è stato un po 'diverso in quanto ho pensato che sarebbe stato bello avere una funzione che restituirebbe una matrice trasposta. Purtroppo, come ho scoperto, non è possibile restituire un una matrice né passare un array a una funzione in C ++ (per non parlare di un doppio array), ma è possibile passare / restituire un puntatore, che funziona in modo simile a un array. Quindi questo è quello che ho fatto:

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

Il trucco era in array dinamici. Ho usato A_rows e B_rows come nomi distinti (è possibile utilizzare solo le righe e colonne) al fine di rendere il problema meno intricata e meno confusione durante la lettura del codice.

B = new int [rows*cols] // This is cool in C++.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top