繁体   English   中英

将成员函数作为参数传递给优化器(将成员函数传递给函数)

[英]Passing member functions as arguments to optimizer (passing member functions to a function)

我试图用DLIB最小化的功能,我可以计算功能,它在给定的参数值的梯度,使用find_min

当函数根据输入而变化时,我定义了一个类,将输入作为类的成员,以及两个公共函数,它们根据当前对解决方案的猜测来计算函数及其梯度:

#include <dlib/matrix.h>
typedef dlib::matrix<double,0,1> column_vector;
class Link
{
   public:
      // Initialisation
      Link(const column_vector& predictors, const column_vector& responses)
         : _predictors(predictors), _responses(responses)
      {
      }

      // Likelihood and first derivative
      double likelihood(const column_vector& b) const;
      column_vector gradient(const column_vector& b) const;

   protected:
      column_vector _predictors;
      column_vector _responses;
};

(为简单起见,省略了计算这些函数的代码)。

然后,我遍历预测器和响应的循环,以最小化每种情况:

column_vector starting_point(2);
Link linear(x, y);

dlib::find_min(dlib::bfgs_search_strategy(),
               dlib::objective_delta_stop_strategy(1e-7),
               linear.likelihood,
               linear.gradient,
               starting_point);

但是,从Link提供非静态成员函数linear.likelihoodlinear.gradient ,我遇到了编译器错误:“必须调用对非静态成员函数的引用”。

我以前通过仅使用可能性重载operator()使其工作,但无法通过两个函数(似然度和梯度)来做到这一点。 将它们转换为函数指针会产生相同的错误。

搜索其他答案在尝试将非静态成员函数作为参数传递时,我发现了类似的问题,但是无法使其在这里工作。 是否有使用模板参数解决此问题的标准解决方案?

还是我完全以错误的方式解决了这个问题,我不应该使用这样的类吗?

dlib::find_min()的参数必须是可以使用function-call operator()调用的对象。 linear.likelihood()调用似然函数并返回结果,但是linear.likelihood本身并不是格式正确的C ++。

一个简单的解决方案是使用lambda表达式并通过引用捕获linear对象。 lambda表达式是可调用的临时对象。

dlib::find_min(dlib::bfgs_search_strategy(),
               dlib::objective_delta_stop_strategy(1e-7),
               [&linear](const column_vector& a) {
                   return linear.likelihood(a);
               },
               [&linear](const column_vector& b) {
                   return linear.gradient(b);
               },
               starting_point);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM