1

我是 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)中提到的这类东西。不幸的是,我对谷神星的了解有限,不确定这是否真的是正确的方法。有人可以帮我吗?如果需要,我很乐意提供更多信息

4

1 回答 1

0

类中的成本函数或评估方法需要能够使用对偶数(ceres::Jet类型)。否则你无法获得自动微分。

由于该Jet类型实现了所有常规标量操作,因此您可以将类成本函数模板化为T(doubleJet): mClass.evaluate<T>()

于 2020-04-23T13:45:32.680 回答