Я новичок в 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. Может ли кто-нибудь помочь мне? Я был бы рад предоставить больше информации, если это необходимо