Ceres-Solver因“终止:残差和雅可比评估失败”而失败。当非静态变量用于定义jacobian for循环时

时间:2019-06-09 01:56:11

标签: ceres-solver

我有一个非线性系统,正在使用Ceres求解。这是一个具有稀疏块结构的稀疏系统。由于我也在处理图像数据,因此我的代码基于“ denoising.cc”示例。

我遇到的问题是我的代码因“终止:残差和Jacobian评估失败”而失败。我可以通过在“评估”中硬编码变量“ num_weights”来解决此问题。

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

任何有关为什么这样做的见识都会有所帮助。

谢谢!

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;
}

1 个答案:

答案 0 :(得分:0)

只是想通了。

基本上,我的向量“ std :: vector weights”超出了范围。 ceres cost函数不保留该向量的所有权,因此“ num_weights”的值为0。