我有一个非线性系统,我正在使用Ceres来解决。它是一个具有稀疏块结构的稀疏系统。由于我还在处理图像数据,因此我的代码基于'denoising.cc‘示例。
我遇到的问题是,我的代码失败,并显示"Terminating: Residual and Jacobian evaluation failed“。我可以通过在Evaluate中硬编码变量'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;
}发布于 2019-06-09 10:03:45
我就想明白了。
基本上,我的向量"std::vector weights“超出了范围。ceres成本函数不保留向量的所有权,因此"num_weights“的计算结果为0。
https://stackoverflow.com/questions/56511416
复制相似问题