2016-01-06 2 views
0

m'a donné le code suivant dans un fichier test.cpp à mettre en œuvre:Comment implémenter matrix.Transpose() pour ma fonction de transposition non statique?

cout << "Case 2: the non-static Transpose function" << endl; 
{ 
    double column[4] = {2, 1, 0, -1}; 
    double row[3] = {2, 0, -1}; 
    Matrix matrix = Matrix::Toeplitz(column, 4, row, 3); 
    cout << "The original Matrix = " << endl; 
    cout << matrix << endl; //This part of the code works 


    matrix.Transpose(); //How do I implement this? 
    cout << "The transposed version = " << endl; 
    cout << matrix << endl; 
    cout << "Press any key to continue ..." << flush; 
    system("read"); 
    cout << endl; 
} 

The Matrix :: façon Toeplitz (colonne 4, ligne 3) fonctionne comme suit:

Matrix Matrix::Toeplitz(const double* column, const int noOfRows, const double* row, const int noOfColumns){ 
    Matrix outT(column, noOfRows, row, noOfColumns); 
    return outT; 
} 

Alors, comment implémenter matrix.Transpose()? Mon code à ce jour est la suivante:

Matrix& Matrix::Transpose() { 

double newrow[noOfRows]; 
for(int i=0; i<noOfRows; i++){ 
    int index = GetIndex(i,0); 
    newrow[i] = data[index]; 
} 

double newcol[noOfColumns]; 
for(int i=0; i<noOfColumns; i++){ 
    int index = GetIndex(0,i); 
    newcol[i] = data[index]; 
} 

Matrix outT(newcol, noOfColumns, newrow, noOfRows); 
} 

Cela n'a aucun effet sur cout<<matrix<<endl;

Je pensais que Matrix outT(newcol, noOfColumns, newrow, noOfRows); devrait donner de nouvelles informations (par exemple la commutation des colonnes et des tableaux ligne) à l'objet de la matrice lorsque la matrice mise en œuvre .Transpose mais cela n'a pas fonctionné.

Est-ce le bon format? Matrix & Matrix :: Transpose() pour implémenter matrix.Transpose()?

Répondre

2

Matrix::Transpose Impossible de renvoyer une référence à un objet déclaré localement. Cela conduira à de nombreux problèmes.

Voir C++ Returning reference to local variable.

Il doit retourner par copie (puis, la fonction peut être const, comme objet courant n'est pas modifié):

Matrix Matrix::Transpose() const 
{ 
    double newrow[noOfRows]; 
    for(int i=0; i<noOfRows; i++){ 
     int index = GetIndex(i,0); 
     newrow[i] = data[index]; 
    } 

    double newcol[noOfColumns]; 
    for(int i=0; i<noOfColumns; i++){ 
     int index = GetIndex(0,i); 
     newcol[i] = data[index]; 
    } 

    return Matrix(newcol, noOfColumns, newrow, noOfRows); 
} 

Ensuite, vous l'utiliser de cette façon:

Matrix transposed = matrix.Transpose(); // does not modify matrix object 
cout << "The transposed version = " << endl; 
cout << transposed << endl; 

Si vous retournez Matrix&, vous devez avoir votre méthode transposer l'objet actuel et le retourner (return *this), seulement utile pour aider l'appelant à enchaîner de nombreux opérateurs (comme par exemple faire m.Transpose().Transpose()).

Ensuite, il pourrait être (non testé):

Matrix& Matrix::Transpose() 
{ 
    // backup old content 
    double* backupData = new double[noOfRows*noOfColumns]; 
    memcpy(backupData, data, sizeof(double)*noOfRows*noOfColumns); 

    // change matrix geometry 
    int oldRowCount = noOfRows; 
    noOfRows = noOfColumns; 
    noOfColumns = oldRowCount ; 

    // transpose matrix by copying from backup content 
    for (unsigned int line = 0; line < noOfRows ; ++line) 
    { 
     for (unsigned int col = line; col < noOfColumns; ++col) 
     { 
      data[line * noOfColumns + col] = backupData[col * noOfRows + line]; 
     } 
    } 

    delete [] backupData; 

    return *this; 
} 

Ensuite, vous l'utiliser de cette façon:

matrix.Transpose(); // modifies matrix object 
cout << "The transposed version = " << endl; 
cout << transposed << endl; 
+0

Cela ne change toujours pas ma matrice pour être transposée. Il semble que mon destructeur soit appelé avant que la version transposée ne soit imprimée – MachoSkinny

+0

Pour la première partie, il appelle la fonction Matrix (colarray, noRows, rowarray, noCols) et imprime la matrice d'origine puis lorsque j'essaie d'implémenter la matrice de la seconde partie. Transpose la fonction Matrix (colarray, noRows, rowarray, noCols) est appelée de nouveau comme prévu, puis un destructeur est appelé avant que la même matrice soit à nouveau imprimée. – MachoSkinny

+0

On dirait que vous êtes complètement perdu dans la notion de classe et d'objet. Vous ne semblez pas réaliser quels objets vous modifiez (une méthode 'Transpose' renvoyant une nouvelle 'Matrix' transposée est différente d'une méthode' Transpose' qui transpose l'objet courant). Je vous recommande de lire quelques tutoriels sur C++ avant d'essayer des opérations complexes comme celle-ci. Quoi qu'il en soit, j'ai mis à jour mon article pour montrer comment Transpose peut modifier l'objet actuel. – jpo38