Produit d'une matrice par un vecteur
Objectifs:
- Créer des fonctions amies (friend)
- Gérer l'amitié entre une fonction membre et une classe
Énoncé:
L'objectif de cet exercice est de calculer le produit d'une martice par un vecteur en utilisant les fonctions amies.
- Créer les deux classes suivantes :
- l’une nommée vecteur, permettant de représenter des vecteurs à 3 composantes ; elle comportera un constructeur et une fonction membre affiche.
- L’autre nommée matrice, permettant de représenter des matrices carrées de dimension 3x3 ; elle comportera un constructeur avec un argument (tableau de 3x3 valeurs) qui initialisera la matrice avec les valeurs et une fonction membre affiche.
- Réaliser une fonction indépendante permettant de fournir le vecteur correspondant au produit d’une matrice par un vecteur.
- Réaliser une fonction membre à la classe vecteur permettant de fournir le vecteur correspondant au produit d’une matrice par un vecteur.
- Ecrire un programme de test.
Affichage du vecteur V:
(1,2,3)
Affichage de la matrice M:
4 2 1
8 7 0
3 5 6
Appel avec la fonction independante:
Le vecteur produit M*V:
(11,22,31)
Appel avec la fonction membre:
Le vecteur produit M*V:
(11,22,31)
Dans l'exemple d’exécution le tableau (vecteur) et la matrice sont initialisés lors de la déclaration.
//Programme : Produit d'une matrice par un vecteur //Auteur : IDMANSOUR //Copyright : Exelib.net #include<iostream> using namespace std; class matrice; class vecteur{ int v[3]; public: vecteur(int *tab) { for(int i=0;i<3;i++) v[i] = tab[i]; } vecteur() { for(int i=0;i<3;i++) v[i] = 0; } void affiche() { cout<<"("<<v[0]<<","<<v[1]<<","<<v[2]<<")"<<endl; } //Décalartion d'amitié pour la fonction indépendante friend vecteur produit(matrice,vecteur); //Déclaration de la fonction membre vecteur produit(matrice); }; class matrice{ int m[3][3]; public: matrice(int tab[][3]) { for(int i=0;i<3;i++) for(int j=0;j<3;j++) m[i][j] = tab[i][j]; } matrice() { for(int i=0;i<3;i++) for(int j=0;j<3;j++) m[i][j] = 0; } void affiche() { for(int i=0;i<3;i++) { for(int j=0;j<3;j++) cout<<m[i][j]<<" "; cout<<endl; } } //Décalartion d'amitié pour la fonction indépendante friend vecteur produit(matrice,vecteur); //Décalartion d'amitié pour la fonction membre à la classe vecteur friend vecteur vecteur::produit(matrice); }; //Définition de la fonction indépendante vecteur produit(matrice M, vecteur V) { vecteur r; for(int i=0;i<3;i++) { r.v[i]=0; for(int j=0;j<3;j++){ r.v[i] += M.m[i][j] * V.v[j]; } } return r; } //Définition de la fonction membre à la classe Vecteur vecteur vecteur::produit(matrice M) { vecteur r; for(int i=0;i<3;i++) { r.v[i]=0; for(int j=0;j<3;j++){ r.v[i]+=M.m[i][j]*v[j]; } } return r; //return produit(M,*this); } int main() { int A[3]={1,2,3},B[3][3]={{4,2,1},{8,7,0},{3,5,6}}; vecteur V(A); matrice M(B); cout << "Affichage du vecteur V: " << endl; V.affiche(); cout << endl << "Affichage de la matrice M: " << endl; M.affiche(); vecteur res; cout << endl << "Appel avec la fonction independante: " << endl; res=produit(M,V); cout << "Le vecteur produit M*V: " << endl; res.affiche(); cout << endl << "Appel avec la fonction membre: " << endl; res=V.produit(M); cout << "Le vecteur produit M*V: " << endl; res.affiche(); return 0; }
Pour compiler convenablement les déclarations de la classe Vecteur contenant une déclaration d'amitié friend vecteur produit(matrice,vecteur); le compilateur n'a pas besoin de connaître les caractéristiques de la classe Matrice. Il lui suffit de savoir qu'il s'agit d'une classe en faisant précéder la déclaration de Vecteur de : class matrice;
En revanche on ne peut pas définir la fonction membre vecteur produit(matrice M) à l’intérieur de la classe Vecteur car le compilateur aura besoin de connaître les attributs de la classe Matrice pour utiliser l'objet M. C'est pour cela qu'il faut la définir après la définition de la classe Matrice.
On peut simplifier la définition de la fonction membre produit en faisant appel à la fonction indépendante:
//Définition de la fonction membre à la classe Vecteur vecteur vecteur::produit(matrice M) { return produit(M,*this); }