我是 Ceres 的初学者(已经研究了不到一周),并且正在尝试使用 ceres 求解器来求解我在课堂上的成本函数。以下是我的代码示例版本,我无法为 ceres 设置成本函数。
struct myStruct {
myStruct() {
}
template <typename T>
bool operator()(const T* params, T* residuals) const {
Myclass mClass;
//I need to set the double[14] params to my class
//mClass.SetParams(params); //params is the array of double[14]
//call the cost function defined within the class
//residuals[0] = T(mClass.evaluate());
//get the double[14] params and residual
//mclass.GetParams(params)
return true;
}
static ceres::CostFunction* Create() {
return (new ceres::AutoDiffCostFunction<myStruct, 1,14>(new myStruct()));
}
]
};
int main(int argc, char** argv)
{
google::InitGoogleLogging(argv[0]);
ceres::Problem problem;
double[14] initParams;
ceres::CostFunction* cost_function = myStruct::Create();
problem.AddResidualBlock(cost_function,
NULL, *initParams);
ceres::Solver::Options options;
options.linear_solver_type = ceres::DENSE_QR;
options.minimizer_progress_to_stdout = true;
ceres::Solver::Summary summary;
ceres::Solve(options, &problem, &summary);
std::cout << summary.FullReport() << "\n";
std::cout << "Press any key to continue....";
getchar();
return 0;
}
该过程应如下所示:我有一个包含 14 个参数的数组 initparam[14],它必须在 myStruct 的 operator() 中输入到我的类中。
当我尝试访问运算符中的 initparam 时,每个元素都不是双精度,而是 ceres Jet。
从我从其他一些博客文章中可以看到,我可能必须实现 ceres 文档( http://ceres-solver.org/interfacing_with_autodiff.html)中提到的这类东西。不幸的是,我对谷神星的了解有限,不确定这是否真的是正确的方法。有人可以帮我吗?如果需要,我很乐意提供更多信息