Trasposizione di una matrice
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!
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++.