我正在尝试为GSL多维最小化算法编写C ++包装器。
我找到了一个很好的解决一维问题的方法,here。
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);
}
};
是否可以修改此代码,使其也适用于多维情况? 我不确定的是如何处理vector参数(请参见下面的struct定义)。
GSL库中提供的multi-min函数结构为:
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;
};