Bonjour à tous,
Je veux faire quelque chose d'assez simple à priori : je veux transformer une fonction qui prend en argument une matrice et un vecteur en une fonction membre de ma classe matrice (qui s'appelle creuse) qui ne prend plus qu'un vecteur en argument.
Comme ma fonction utilise plusieurs classes et que je ne comprends pas le problème j'ai un peu de mal à le réduire à un problème minimal. Je propose plutot une comparaison avant/après:
Voici le code avant (qui marche très bien):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 vecteur gradientConjugue(creuse ma, vecteur b){ vecteur rep(b.getsize()); double epsilon=0.000001; vecteur reste(ma.prod(rep)-b); vecteur proj(ma.prod(rep)-b); int compt=1; while(compt<=200000 && reste.normeCarre()>=(epsilon*epsilon)){ double alpha=reste.normeCarre()/produitScalaire(proj,ma.prod(proj)); double aux=reste.normeCarre(); rep=rep-prod(alpha,proj); reste=reste-prod(alpha,ma.prod(proj)); double beta=reste.normeCarre()/aux; proj=reste+prod(beta,proj); compt=compt+1; } std::cout << compt; return rep; }
et le code après:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 vecteur creuse::gradientConjugue(vecteur b){ vecteur rep(b.getsize()); double epsilon=0.000001; vecteur reste(this->prod(rep)-b); vecteur proj(this->prod(rep)-b); int compt=1; while(compt<=200000 && reste.normeCarre()>=(epsilon*epsilon)){ double alpha=reste.normeCarre()/produitScalaire(proj,this->prod(proj)); double aux=reste.normeCarre(); rep=rep-prod(alpha,proj); reste=reste-prod(alpha,this->prod(proj)); double beta=reste.normeCarre()/aux; proj=reste+prod(beta,proj); compt=compt+1; } std::cout << compt; return rep; }
j'ai un message d'erreur à la ligne rep=rep-prod(alpha,proj) qui me dit que je fournis double& et vecteur& et qu'il n'y a pas de fonctions avec une telle signature (ma fonction prod prend en argument un double et un vecteur , cf code qui marche bien).
Ceci doit mettre en lumière ma non compréhension des references parceque je pense bien fournir un double et un vecteur, et puis une reference étant un alias de l'objet je ne vois pas comment il peut interpreter que je lui donne une reference.
Partager