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