首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ceres-Solver失败并显示"Terminating:残差和雅可比求值失败“。当非静态变量用于定义jacobian for-loop时

Ceres-Solver失败并显示"Terminating:残差和雅可比求值失败“。当非静态变量用于定义jacobian for-loop时
EN

Stack Overflow用户
提问于 2019-06-09 09:56:11
回答 1查看 1.2K关注 0票数 1

我有一个非线性系统,我正在使用Ceres来解决。它是一个具有稀疏块结构的稀疏系统。由于我还在处理图像数据,因此我的代码基于'denoising.cc‘示例。

我遇到的问题是,我的代码失败,并显示"Terminating: Residual and Jacobian evaluation failed“。我可以通过在Evaluate中硬编码变量'num_weights‘来修复这个问题。

当我在一个或多个像素上调用此函数时,问题仍然存在。对于每个像素,我的权重是不同的。

任何关于这是为什么的洞察力都会有所帮助。

谢谢!

代码语言:javascript
复制
Cost::Cost(const std::vector<double> &weights) : _weights(weights)
{
    set_num_residuals(1);
    mutable_parameter_block_sizes()->push_back(1); //has more parameters than weights

    for (int i = 0; i < _weights.size(); ++i)
        mutable_parameter_block_sizes()->push_back(1);
}

bool Cost::Evaluate(double const* const* parameters,
                             double *residuals,
                             double **jacobians) const
{
    int num_weights = (int)_weights.size();

    float d0 = parameters[0][0];
    residuals[0] = d0;

    for (int i = 0; i < num_weights; ++i)
    {
        residuals[0] += parameters[i+1][0];
    }

    if (jacobians != NULL)
    {
        for (int i = 0; i < num_weights+1; ++i)
        {
            if (jacobians[i] != NULL)
            {
                jacobians[i][0] = 0;
            }
        }
    }

    return true;
}
EN

回答 1

Stack Overflow用户

发布于 2019-06-09 10:03:45

我就想明白了。

基本上,我的向量"std::vector weights“超出了范围。ceres成本函数不保留向量的所有权,因此"num_weights“的计算结果为0。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56511416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档