Я пытаюсь написать оболочку C ++ для алгоритма многомерной минимизации GSL.
Я нашел это хорошее решение для одномерного случая, которое, кажется, работает довольно хорошо, здесь .
template< typename F, typename U > class gsl_function_fdf_pp : public gsl_function_fdf
{
public:
gsl_function_fdf_pp(const F& kf, const U& kdf) : _f(kf), _df(kdf)
{
f = &gsl_function_fdf_pp::invoke;
df = &gsl_function_fdf_pp::invoke2;
fdf = &gsl_function_fdf_pp::invoke3;
params=this;
}
private:
const F& _f;
const U& _df;
static double invoke(double x, void *params)
{
return static_cast<gsl_function_fdf_pp*>(params)->_f(x);
}
static double invoke2(double x, void *params)
{
return static_cast<gsl_function_fdf_pp*>(params)->_df(x);
}
static void invoke3(double x, void * params, double* f, double* df)
{
(*f) = static_cast<gsl_function_fdf_pp*>(params)->_f(x);
(*df) = static_cast<gsl_function_fdf_pp*>(params)->_df(x);
}
};
Есть ли способ изменить этот код так, чтобы он работал и для многомерного случая?В чем я не уверен, так это в том, как обращаться с векторным параметром (см. Определение структуры ниже).
Структура многоминутной функции, заданная в библиотеке GSL:
struct gsl_multimin_function_fdf_struct
{
double (* f) (const gsl_vector * x, void * params);
void (* df) (const gsl_vector * x, void * params,gsl_vector * df);
void (* fdf) (const gsl_vector * x, void * params,double *f,gsl_vector * df);
size_t n;
void * params;
};