Bonjour à tous
Aller, tout de suite, un petit ECM, pour présenter le problème, que je commente ensuite:
Je créé une classe FitFonction, qui va donc regrouper plusieurs type de fonction mathématique de base.
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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 #include <iostream> #include <string> #include <vector> #include <math.h> #include <cassert> class FitFonction { /// classe abstraite public: /// Accesseurs std::vector<double> getParams() const { return _params; }; int getNbParams() const { return _params.size(); }; double get( int i ) const { return _params[i]; }; /// Setters void setParams(const std::vector<double>& param){ assert(param.size()==_params.size()); _params=param; }; /// Pour evaluer la fonction virtual double eval(double x) const=0; // le "= 0" à la fin indique que c'est une fonction virtuelle pure std::vector<double> eval(const std::vector<double>& x) const { /// <----- ici je surcharge la fonction eval std::vector<double> res(x.size(),0.0); for (int i=0;i<x.size();i++) res[i]=eval(x[i]); return res; }; protected: std::vector<double> _params; }; class Gaussienne : public FitFonction { /// 1 Gaussienne = 3 paramètres public: Gaussienne(double h, double c, double e){ _params.resize(3); _params[0]=h; _params[1]=c; _params[2]=e; }; double eval(double x) const {return _params[0]*exp(pow((x-_params[1])/_params[2],2.0));}; }; int main( int argc, char* argv[] ){ Gaussienne fct(1.3,2.0,5.3); std::vector<double> xx(7,0.2),yy(7); //yy=fct.eval(xx); std::cout << "Hello World !" << std::endl; }
Ces fonctions de bases dépendent de paramètres (que je met en attribut de classe).
Quelquesoit la fonction mathématique, je vais avoir envie de l'évaluer, en un point ou en un vecteur de points.
Je créer donc la méthode "virtual double eval(double)" en virtuelle pure, car elle dépendra de ma fonction mathématique (dans l'exemple j'ai pris une gaussienne, mais on pourrait très bien y ajouter des fonctions affines, logarithmiques, etc...).
Je définis ensuite ma méthode d'évaluation dans ma classe fille Gaussienne.
Jusque là tout va bien.
Maintenant, je vais souvent avoir besoin d'évaluer, non pas un seul point, mais un vecteur de point.
Je veux donc surcharger ma fonction eval: "std::vector<double> eval( const std::vector<double>& )".
Et c'est ce que j'essaie de faire ligne 19 à 23, mais il semble que ca ne marche pas ...
Dans le main, je veux pouvoir décommenter la ligne 40. Si je le fais je me fais insulter par le compilo :
Merci pour votre aide.test.cxx:91:15: error: no viable conversion from 'std::vector<double>' to 'double'
yy=fct.eval(xx);
^~
Partager