
C'est bien. Une petite remarque: lors d'un changement de base (dans un sens ou dans l'autre) tu fais nbpixels * calcul entier de chaque shaplet. En enregistrant dans un vecteur temporaire les shapelets, tu ne calcules chaque shapelets qu'une fois (ce qui devrait booster à mort le changement de base). (vecteur d'image 2d de double).
+ struct hermite : public std::binary_function<T, int, T> + { + T operator()(unsigned n, T x) { - assert(n >= 0); if (n == 0) return 1; if (n == 1) return 2. * x; - return 2. * (x * hermite(n - 1, x) - (n - 1) * hermite(n - 2, x)); + return 2. * x * (*this)(n - 1, x) - 2. * double(n - 1) * (*this)(n - 2, x);
Ces deux lignes ne sont pas identiques?
} + };
Dans les functors c'est pratique d'avoir un typedef du type de retour (result_type).
//FIXME: ima should be non_vectorial
Normalement il faudrait une abstract::non_vectorial_image_with_dim. Il n'y en a pas. Actuellement le mieux est de faire une assertion statique (is_a).
template <class I> std::vector<double> - to_shapelet_basis_2d(const oln::abstract::image_with_dim<2, I>& ima, + shapelets(const oln::abstract::image_with_dim<2, I>& ima, int m, int n, double b) { assert(m >= 0 && n >= 0 && b >= 0);
Pense à changer assert en precondition.
+ shapelets_basis<2, double> func;
Peux-tu essayer avec des float pour voir s'il y a une différence (précision/temps)?
- if ( !(resf[it] >= 0 && resf[it] < 256)) + if ( !(resf[it] >= 0 && resf[it] <= 255))
0 => ntg_min_val(T) (! parfois c'est ntg_zero_val(T)!) 255 => ntg_max_val(T) PS: qu'en est-il des tests avec b != 4 sur l'exemple de l'auteur? -- Niels