La Multiplication de matrice avec la surcharge d'opérateur
Je suis d'essayer de créer une surcharge de l'opérateur pour une matrice de classe que j'ai construit. Mon matrice classe stocke la matrice dans un allouée dynamiquement tableau multidimensionnel. Je suis simplement en train de tester mon opérateur surchargé par la multiplication de deux matrices ensemble que sont exactement les mêmes et afficher le résultat. J'obtiens des résultats bizarres et je crois que ça a à voir avec des conditions sur mes boucles for. J'ai cependant de marcher à travers tous mes boucles for et peut trouver rien de mal. Les matrices je suis multipliant sont à la fois 6x6.
Mon opérateur surchargé
template <typename T>
const matrix<T> matrix<T>::operator * (const matrix& right) const
{
matrix<T> c = right;
int sum_elems;
for( int i = 0; i < this->rows - 1; ++i)
{
for(int j = 0; j < right.cols - 1; ++j)
{
sum_elems = 0;
for( int k = 0; k < right.rows - 1; ++k)
{
sum_elems += this->the_matrix[i][k] * right.the_matrix[k][j];
}
c.the_matrix[i][j] = sum_elems;
}
}
return c;
}
Maintenant, mon appel à l'opérateur surchargé dans ma fonction principale:
std::cout << my_matrix;
matrix<int> copy_matrix;
copy_matrix = my_matrix * my_matrix;
std::cout << copy_matrix;
Ma sortie:
The Matrix:
0 1 0 1 1 0
1 0 1 0 1 1
0 1 0 1 0 1
1 0 1 0 1 0
1 1 0 1 0 1
0 1 1 0 1 0
The Matrix:
-1 33 139587680 18 38 75
139587680 18 38 75 157 1
139587712 38 1470 4365 10411 1
139587744 75 4365 19058932 64514866 0
139587776 157 10411 64514866 1136204102 1
139596144 1 1 0 1 0
Comme vous pouvez le voir, il semble que je suis sorti des limites du terrain sur l'un de mes tableaux. Je n'arrive pas à trouver où. Je vous remercie de votre aide à l'avance.
Edit: Comme l'a demandé ma mise en œuvre intégrale de ma classe matrix
Matrice Définitions:
template <typename T>
class matrix
{
public:
//Default Constructor
matrix();
//Overloaded Constructor
matrix(std::ifstream&, const char*);
//Copy Constructor
matrix(const matrix&);
//Destructor
~matrix();
//overloaded operators
T* operator [] (T);
const matrix operator * (const matrix&) const;
matrix& operator = (const matrix&);
friend std::ostream& operator << <T> (std::ostream&, const matrix<T>&);
private:
T** the_matrix;
unsigned rows, cols;
De La Matrice De Mise En Œuvre:
/* Template version of matrix class */
/*---------------------------------------------------------------------------*/
//Default contructor
template <typename T>
matrix<T>::matrix() { }
//Overloaded contructor
template <typename T>
matrix<T>::matrix( std::ifstream& in, const char* file)
{
//declare the variables to be used
T vertices, edges, u, v;
std::string line;
//open file for reading
in.open(file);
//get number of vertices
in >> vertices;
//throw away second line
std::getline(in, line);
std::getline(in, line);
//get number of edges and dump them in two arrays
in >> edges;
T edge1 [edges];
T edge2 [edges];
int j = 0, k = 0;
for(int a = 0; a < edges; ++a)
{
in >> u >> v;
edge1[j] = u;
edge2[k] = v;
++j;
++k;
}
in.close();
//Create multi-dim-dynamic array
rows = vertices;
cols = vertices;
the_matrix = new T*[rows];
for( int b = 0; b < rows; ++b)
{
the_matrix[b] = new T [rows];
}
//Initialize array values to zero
for ( int c = 0; c < rows; ++c)
{
for( int d = 0; d < cols; ++d)
{
the_matrix[c][d] = 0;
}
}
//push the edges to the matrix
for( int e = 0; e < edges; ++e)
{
the_matrix[edge1[e] - 1][edge2[e] - 1] = 1;
}
for ( int f = 0; f < edges; ++f)
{
the_matrix[edge2[f] - 1][edge1[f]-1] = 1;
}
}
//Copy Constructor
template <typename T>
matrix<T>::matrix(const matrix& left)
{
the_matrix = left.the_matrix;
rows = left.rows;
cols = left.cols;
spath = left.spath;
}
//Destructor
template <typename T>
matrix<T>::~matrix()
{
//Deletes the data in reverse order of allocation
for( int a = cols; a > 0; --a)
{
delete[ ] the_matrix[a];
}
delete[ ] the_matrix;
}
//Overloaded * Operator
template <typename T>
const matrix<T> matrix<T>::operator * (const matrix& right) const
{
matrix<T> c = right;
T sum_elems;
for( int i = 0; i < this->rows - 1; ++i)
{
for(int j = 0; j < right.cols - 1; ++j)
{
sum_elems = 0;
for( int k = 0; k < right.rows - 1; ++k)
{
sum_elems += this->the_matrix[i][k] * right.the_matrix[k][j];
}
c.the_matrix[i][j] = sum_elems;
}
}
return c;
}
//Overloaded assignment Operator
template <typename T>
matrix<T>& matrix<T>::operator = (const matrix& right)
{
this->the_matrix= right.the_matrix;
this->rows = right.rows;
this->cols = right.cols;
this->spath = right.spath;
return *this;
}
//Overloaded << operator
template <typename T>
std::ostream& operator << (std::ostream& output, const matrix<T>& left)
{
//Test screen output to see if correct
std::cout << std::setw(14) << "The Matrix:" << '\n';
for( int a = 0; a < left.rows; ++a)
{
for( int b = 0; b < left.cols; ++b)
{
std::cout << ' ' << left.the_matrix[a][b] << ' ';
}
std::cout << '\n';
}
return output;
}
new
et delete
, plutôt que d'utiliser un vecteur? Si oui, pourquoi?Constructeur de copie et l'opérateur d'affectation fonctionnent à la perfection. Je ne suis pas à l'aide d'un
vector
précisément parce que je suis en train d'en savoir plus sur l'utilisation de l'opérateur new
et delete
et de la gestion manuelle de la mémoire au lieu de toujours compter sur les vector
faire le derrière de la scène de travail.
OriginalL'auteur Nic Young | 2012-02-19
Vous devez vous connecter pour publier un commentaire.
Comme je le soupçonnais, votre constructeur de copie et l'opérateur d'affectation ne sont en fait pas correctement mis en œuvre. Vous êtes simplement de copier le pointeur de la souris sur. Cela signifie que lorsque vous copiez une matrice à l'autre, ils partagent les mêmes données. Quand l'un d'eux est hors de portée, le destructeur est appelé, puis les données partagées sont supprimés, laissant le reste de la matrice avec en balançant les pointeurs.
Corriger ces fonctions donc ils sont en fait allouer de nouveaux tableaux, et de copier les données.
OriginalL'auteur Benjamin Lindley
i
va en fait de0
àthis->rows - 2
(en raison dei < n-1
pouri = n-1
est faux). De même pour d'autres boucles. Cela ne semble pas être le comportement correct pour les matrices de multiplication.P. S. Si T est le type des éléments de la matrice, puis le type de
sum_elems
devrait êtreT
.OriginalL'auteur Artem Sobolev