我有一个问题与最小化库在GSL。 我试图实现没有导数的算法,但是为了使用我需要通过函数来最小化:
https://www.gnu.org/software/gsl/doc/html/multimin.html?highlight=最小化
我正在学习没有导数的算法,但是当我尝试在我的成员类函数:my_func中使用时,我得到了这个:
“class::my_func”从类型“double(class::)(const gsl_vector*,void*)”到类型“double()(const gsl_vector,void*)”
该算法似乎不能使用成员类函数。 我的问题是如何绕过这一点,将成员类函数转换成一个正常的(类C)函数?
GSL使用params
将任意参数传递到函数中。 使用指向对象的指针作为“参数”。
创建一个代理函数,即类中的静态
成员函数,它接收参数
。 在此函数中,将params
转换为正确的类型(指向类
的指针),并调用其中的成员函数。
如果您的my_func
是public
,则可以使用非成员(“全局”)代理函数。
class Class
{
double my_func(const gsl_vector*) // the real function
{
...
}
static double static_my_func(const gsl_vector* v, void* params) // proxy function
{
Class* object = static_cast<Class*>(params);
return object->my_func(v);
}
};
如果您的真正函数想要接收额外的参数,您必须以某种方式来适应这一点,例如,使参数成为类
的成员,或者(更复杂但更面向对象)创建一个临时的结构
,其中包含指向对象和额外参数的指针。