|
@@ -13,15 +13,23 @@ using namespace lapack_c;
|
|
|
// Interpolation rbf.
|
|
|
//-------------------------------------------------------------------------
|
|
|
template<typename real,class Radial> class RBFInterp{
|
|
|
- double * matrix , *b;
|
|
|
- real * image;
|
|
|
+ // on met tout dans une classe paramétrée par le type de flottants,
|
|
|
+ // et par Radial qui est le type (cllase) de fonction d'interpolation.
|
|
|
+ double * matrix , *b; // pour le système linaéire
|
|
|
+ real * image; // l'"image"
|
|
|
real eps;
|
|
|
- int imgsize_x,imgsize_y;
|
|
|
+ int imgsize_x,imgsize_y; // tailles
|
|
|
+ // work sert à lapack (tableau de travail).
|
|
|
double rcond,innorm; double *work; bool rcondok;
|
|
|
+
|
|
|
public:
|
|
|
+ // Ce qui définit les points de mesure
|
|
|
// (x,y) -> valeur
|
|
|
- // Il ne faut pas d'ex-aequeo pour (x,y), d'où l'utilisation d'une map
|
|
|
+ // NB:
|
|
|
+ // Il ne faut pas d'ex-aequo pour (x,y), d'où l'utilisation d'une map
|
|
|
// pour décrire les noeuds de l'interpolation.
|
|
|
+ //Clé de la map: paire d'entiers (ordonnée lexicographiquement)
|
|
|
+ // Les clés sont uniques.
|
|
|
typedef std::map<pair<int,int>,real> PointValue;
|
|
|
|
|
|
// consructeur:
|
|
@@ -33,7 +41,7 @@ public:
|
|
|
// comp_cond : on calcule ou non le conditionnement L\infinity de
|
|
|
// la matrice.
|
|
|
{
|
|
|
- Radial R(eps);
|
|
|
+ Radial R(eps); // fontion d'interpolation, à eps fixé.
|
|
|
int np= values.size();
|
|
|
|
|
|
matrix = new double[np*np];
|
|
@@ -43,18 +51,22 @@ public:
|
|
|
// matrice).
|
|
|
|
|
|
// 1) matrice:
|
|
|
- auto indix= [np](int i, int j){return i*np+j;};
|
|
|
+ auto indix= [np](int i, int j){return i*np+j;};//lambda function.
|
|
|
int i=0;
|
|
|
for(typename PointValue::const_iterator I=values.begin();
|
|
|
- I!=values.end();I++)
|
|
|
+ I!=values.end();I++) //parcourir la map. Boucle sur les fonctions
|
|
|
{
|
|
|
- auto v= I->first; //la fonction est centrée en ce point.
|
|
|
+ auto v= I->first; //la fonction est centrée en ce point (paire i,j)
|
|
|
int j=i;
|
|
|
for(typename PointValue::const_iterator J=I;J!=values.end();++J)
|
|
|
+ // boucle sur les points
|
|
|
{
|
|
|
+ //calculer la distance r entre le point I et le point J
|
|
|
+ // et y applique la fonction radiale ->s.
|
|
|
+
|
|
|
auto s = R(r(v,J->first));
|
|
|
matrix[indix(i,j)]=s;
|
|
|
- if(i!=j)
|
|
|
+ if(i!=j)//matrice symétrique
|
|
|
matrix[indix(j,i)] =s;
|
|
|
++j;
|
|
|
}
|
|
@@ -127,7 +139,6 @@ public:
|
|
|
}
|
|
|
real Interpolator(PointValue& values,int nx,int i,int j,Radial R)
|
|
|
{
|
|
|
- //auto indix= [nx](int i, int j){return i*nx+j;};
|
|
|
real s=0.0;
|
|
|
int k=0;
|
|
|
for(typename PointValue::const_iterator K=values.begin();
|