Multiplication de deux matrices - C++ - Programmation
Marsh Posté le 19-02-2006 à 11:29:35
Pas mal de possibilités:
Pas assez de code pour tirer une conclusion. En debuggant, tu n'as pas trouvé ce qui cloche ?
Marsh Posté le 19-02-2006 à 11:36:25
pas d'erreur en compilant.
J'ai fait une surcharge de l'opérateur = :
matrice &matrice::operator=(matrice &m1)
// Affectation d'une matrice à une autre
{
int i,j;
if(&m1 != this)
{
for(i=0;i<ligne;i++)
{
for(j=0;j<colonne;j++)
{
mat[i][j] = m1.mat[i][j];
}
}
}
else
{
cout << "(matrice) Erreur d\'affectation !" << endl;
}
return *this;
}
et mon constructeur initialise à 0 :
matrice::matrice(int lig, int col)
// constructeur
{
for (int i=0;i<lig;i++)
{
for (int j=0;j<col;j++)
{
mat[i][j]=0;
}
}
ligne = lig;
colonne = col;
}
mais ce qui est bizzare cv'est que quand je fais un affichage dans ma fonction * juste avant le return, ça me met bien la matrice attendue.
Marsh Posté le 19-02-2006 à 11:38:25
Essaies ça :
matrice &matrice::operator=(const matrice &m1)
Marsh Posté le 19-02-2006 à 11:39:47
Y a un truc qui me chiffonne : comment est instancié le tableau qui conserve les coefficients ?
Là je pense que le compilo fait la chose suivante:
Marsh Posté le 19-02-2006 à 11:45:29
Quel est le type du (pseudo?) tableau à deux dimensions "mat" ?
Marsh Posté le 19-02-2006 à 11:49:40
Sinon il existe ça prêt à l'usage:
http://www.boost.org/libs/numeric/ublas/doc/matrix.htm
Marsh Posté le 19-02-2006 à 12:02:15
#define MAX_LIGNE 50
#define MAX_COLONNE 50
class matrice
{
private :
int ligne;
int colonne;
int mat[MAX_LIGNE][MAX_COLONNE];
Marsh Posté le 19-02-2006 à 12:02:43
en fait, je comprend pas car j'ai le même prob sur plusieurs fonctions et pourtant elles sont toutes simples
Marsh Posté le 19-02-2006 à 12:03:40
du style j'ai aussi celle pour inverser 2 lignes d'une matrice qui fonctionne pas :
void matrice::inverserLignes(int i,int j)
// inverse les lignes i et j de la matrice courrante
{
int tmp = 0;
for(int col=0;col<colonne;col++)
{
tmp = mat[i][col];
mat[i][col] = mat[j][col];
mat[j][col] = tmp;
}
}
quand je veux inverser les 2 dernières lignes de ma matrice :
100
001
010
elle m'affiche
100
001
-84563147 -654878 -545485
du moins un truc dans le style
Marsh Posté le 19-02-2006 à 13:02:04
Oulà ! Ta solution présente plusieurs défauts:
Taz serait là il te dirait : vector<vector<double>>.
Bref il faut utiliser un adressage dynamique contrôlé.
Si c'est un travail professionnel (et non un exercice d'école), je te conseille d'utiliser une classe standard dont celle de boost qui fera parfaitement l'office:
http://www.boost.org/libs/numeric/ublas/doc/matrix.htm
Si tu persistes dans cette voie je te conseille d'accéder aux éléments de mat via un accesseur/mutateur approprié:
Code :
|
Marsh Posté le 19-02-2006 à 13:10:38
Taz dirait : mat doit être un vector<vector<double>>.
Marsh Posté le 19-02-2006 à 13:14:23
Trouvé sur le forum :
http://forum.hardware.fr/hardwaref [...] 3874-1.htm
Marsh Posté le 19-02-2006 à 19:28:29
Fais un new matrice et retourne une référence sur l'objet matrice.
Marsh Posté le 19-02-2006 à 10:30:22
Bonjour à tous,
J'ai fait une classe matrice et j'ai surchargé l'opérateur * afin de multiplier 2 matrices, le voilà :
matrice matrice::operator*(const matrice &m1)
{
matrice result(ligne,m1.colonne);
if(colonne == m1.ligne) // si nb colonnes = nb lignes de l'autre matrice
{
for(int i=0;i<ligne;i++) //pour chaque ligne
{
for(int j=0;j<m1.colonne;j++) // pour chaque colonne
{
for(int k=0;k<colonne;k++) // produit scalaire
result.mat[i][j] += mat[i][k]*m1.mat[k][j];
}
}
}
else
{
cout<<"Matrices incompatibles,operation impossible !"<<endl;
}
return result;
}
J'ai également surchargé l'opérateur << d'affichage qui marche très bien (je l'ai testé), mais quand je fais :
cout<<"m1 * m2 = "<<(m1*m2)<< endl;
cout<<endl;*/
Rien ne s'affiche. J'ai essayé plusieurs choses, mais je n'arrive pas à comprendre pourquoi cela ne veut pas marcher !
Merci d'avance pour votre aide.