Реализация решателя ceres для целевой функции в классе - PullRequest
1 голос
/ 08 апреля 2020

Я новичок в 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], который имеет чтобы быть введенным в мой класс в operator () в myStruct.

Когда я пытаюсь получить доступ к initparam в пределах оператора, каждый элемент не является двойным, а является чистым Jet.

Из того, что я видел по некоторым другим постам в блоге, мне, возможно, придется реализовать что-то подобное, упомянутое в документации ceres (http://ceres-solver.org/interfacing_with_autodiff.html). К сожалению, у меня ограниченные знания о ceres, и я не уверен, что это действительно правильный путь к go. Может ли кто-нибудь помочь мне? Я был бы рад предоставить больше информации, если это необходимо

1 Ответ

0 голосов
/ 23 апреля 2020

Функция стоимости или метод оценки внутри вашего класса должны уметь работать с двойными числами (тип ceres::Jet). В противном случае вы не сможете получить автоматическое дифференцирование c.

Поскольку тип Jet реализует все обычные скалярные операции, вы можете просто шаблонировать функцию стоимости класса на T (double или * 1007). *): mClass.evaluate<T>().

...