我正在尝试使用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);
但是,我尝试从linear.likelihood
提供非静态成员函数linear.gradient
和Link
时出现编译器错误:“必须调用对非静态成员函数的引用”
我以前通过仅使用可能性重载operator()
来使它起作用,但是不能通过两个函数(似然度和梯度)来做到这一点。将它们转换为函数指针会产生相同的错误。
搜索其他答案在尝试将非静态成员函数作为参数传递时,我发现了类似的问题,但是无法使其在这里工作。是否有使用模板参数解决此问题的标准解决方案?
还是我完全以错误的方式解决了这个问题,我不应该使用这样的类吗?
答案 0 :(得分:1)
dlib::find_min()
的参数必须是可以通过函数调用operator()
调用的对象。 linear.likelihood()
调用似然函数并返回结果,但是linear.likelihood
本身不是格式正确的C ++。
一个简单的解决方案是使用lambda expressions并通过引用捕获对象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);