提问者:小点点

在C++中使用GSL最小化


我有一个问题与最小化库在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)函数?


共1个答案

匿名用户

GSL使用params将任意参数传递到函数中。 使用指向对象的指针作为“参数”。

创建一个代理函数,即类中的静态成员函数,它接收参数。 在此函数中,将params转换为正确的类型(指向的指针),并调用其中的成员函数。

如果您的my_funcpublic,则可以使用非成员(“全局”)代理函数。

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);
    }
};

如果您的真正函数想要接收额外的参数,您必须以某种方式来适应这一点,例如,使参数成为的成员,或者(更复杂但更面向对象)创建一个临时的结构,其中包含指向对象和额外参数的指针。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中|gsl|最小化)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?