gpt4 book ai didi

c++ - Ceres 求解器 C++ : Segmentation fault: 11

转载 作者:行者123 更新时间:2023-11-28 04:16:36 25 4
gpt4 key购买 nike

我正在尝试使用 Google 的 Ceres Solver 求解非线性系统。下面的示例来自此页面:http://terpconnect.umd.edu/~petersd/460/html/newtonex1z.html

我首先创建一个名为 MatlabExample 的类,我在其中计算残差jacobians:

class MatlabExample
: public SizedCostFunction<2,2> {
public:
virtual ~MatlabExample() {}
virtual bool Evaluate(double const* const* parameters,
double* residuals,
double** jacobians) const {

double x1 = parameters[0][0];
double x2 = parameters[0][1];

residuals[0] = 2*x1+x1*x2-2;
residuals[1] = 2*x2-x1*pow(x2,2)-2 ;

if (jacobians != NULL && jacobians[0] != NULL) {
jacobians[0][0] = 2+x2;
jacobians[0][1] = x1;
jacobians[1][0] = -pow(x2,2);
jacobians[1][1] = 2-2*x1*x2;
}

return true;
}
};

主要文件如下:

int main(int argc, char** argv) {
google::InitGoogleLogging(argv[0]);

double x[] = { 0.0,0.0 };

Problem problem;
CostFunction* cost_function = new MatlabExample;
problem.AddResidualBlock(cost_function, NULL, &x);
Solver::Options options;
options.minimizer_progress_to_stdout = true;
Solver::Summary summary;
Solve(options, &problem, &summary);

std::cout << summary.BriefReport() << "\n";

return 0;
}

编译时,出现Segmentation fault: 11 错误。有什么想法吗?

最佳答案

您错误地访问了 jacobians 数组。原因如下。

当您添加残差 block 时,您告诉 Ceres 成本函数仅取决于一个大小为 2 的参数 block 并产生大小为 2 的残差。

jacobians 数组是行优先 jacobians 的数组。每个参数 block 一个。所以在这种情况下,它的大小为 1,并且包含一个指向大小为 4 的数组的指针,该数组应该包含行主雅可比矩阵。

您的雅可比填充代码应该改为阅读

if (jacobians != NULL && jacobians[0] != NULL) {
jacobians[0][0] = 2+x2;
jacobians[0][1] = x1;
jacobians[0][2] = -pow(x2,2);
jacobians[0][3] = 2-2*x1*x2;
}

关于c++ - Ceres 求解器 C++ : Segmentation fault: 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56450962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com