【问题标题】:Using GSL Minimize in C++在 C++ 中使用 GSL 最小化
【发布时间】:2020-06-08 14:43:24
【问题描述】:

我在使用 GSL 中的最小化库时遇到问题。我试图在没有导数的情况下实现算法,但为了使用我需要传递函数来最小化:

https://www.gnu.org/software/gsl/doc/html/multimin.html?highlight=minimization

我正在关注他们在没有导数的情况下所拥有的算法,但是当我尝试在我的成员类函数中使用时:my_func 我得到了这个:

'Class::my_func' 从类型 'double (Class::)(const gsl_vector*, void*)' 到类型 'double ()(const gsl_vector, void*)'

该算法似乎不能使用成员类函数。我的问题是如何绕过这个并将成员类函数转换为普通(C 类)函数?

【问题讨论】:

    标签: c++ c


    【解决方案1】:

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

    在你的类中创建一个代理函数,一个static 成员函数,它接收params。在该函数内部,将params 转换为正确的类型(指向您的Class 的指针),并调用其中的成员函数。

    如果您的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);
        }
    };
    

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

    【讨论】:

    • 好的,现在它可以工作了,但我忘了提到我的函数 my_like 是双精度的,而不是恒定的 gsl_vector,有什么方法可以转换它吗?我的函数使用指针而不是 gsl_vector:编译器说:没有已知的参数 1 从‘const gsl_vector*’到‘double*’的转换
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多