C++ 修改平方和[ceres解算器]
我试图修改ceres的默认行为,即计算残差的平方和作为成本函数。我希望它只计算一个和(残差已经以只能为正的方式计算) 根据我应该使用的文档 这就是我所做的: 我定义了接受1个残差和1个参数的调节器C++ 修改平方和[ceres解算器],c++,ceres-solver,C++,Ceres Solver,我试图修改ceres的默认行为,即计算残差的平方和作为成本函数。我希望它只计算一个和(残差已经以只能为正的方式计算) 根据我应该使用的文档 这就是我所做的: 我定义了接受1个残差和1个参数的调节器 struct Conditioners : ceres::CostFunction { public: Conditioners() { set_num_residuals(1); mutable_parameter_block_sizes()->
struct Conditioners : ceres::CostFunction
{
public:
Conditioners()
{
set_num_residuals(1);
mutable_parameter_block_sizes()->push_back(1);
}
~Conditioners()
{}
template<typename T>
T operator() (T x)
{
return T(x * x);
}
bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) const
{
return true;
}
};
而不是:
iter cost cost_change |gradient| |step| tr_ratio tr_radius ls_iter iter_time total_time
0 4.512500e+01 0.00e+00 9.50e+00 0.00e+00 0.00e+00 1.00e+04 0 2.99e-04 1.04e-03
1 4.511598e-07 4.51e+01 9.50e-04 9.50e+00 1.00e+00 3.00e+04 1 3.84e-04 9.72e-03
2 5.012552e-16 4.51e-07 3.17e-08 9.50e-04 1.00e+00 9.00e+04 1 2.98e-05 9.92e-03
Ceres Solver Report: Iterations: 2, Initial cost: 4.512500e+01, Final cost: 5.012552e-16, Termination: CONVERGENCE
x : 0.5 -> 10
(如果您想自己尝试,此示例将修改)
你对哪里出了问题有什么指导吗??(ceres报告没有更具体的内容)我找到了解决方案,即:
struct Conditioners : ceres::CostFunction
{
public:
Conditioners()
{
set_num_residuals(1);
mutable_parameter_block_sizes()->push_back(1);
}
~Conditioners()
{}
template<typename T>
T operator() (T x)
{
return T(x * x);
}
bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) const
{
residuals[0] = parameters[0][0] * parameters[0][0]
if (jacobians)
jacobians[0][0] = 2.0 * parameters[0][0]
return true;
}
};
结构调节器:ceres::CostFunction
{
公众:
调节器()
{
设置_num_残差(1);
可变参数块大小()->推回(1);
}
~z()
{}
模板
T运算符()(T x)
{
返回T(x*x);
}
布尔求值(双常数*常数*参数,双*残差,双**雅可比数)常数
{
残差[0]=参数[0][0]*参数[0][0]
if(雅可比)
雅可比矩阵[0][0]=2.0*参数[0][0]
返回true;
}
};
我的错误是认为我只需要重新实现()操作符,ceres就会自动找到雅可比矩阵。没有。我不知道您使用的ceres框架。。。但为什么求值函数总是返回true,而不执行其他操作呢?看起来这可能是你问题的根源…事实上是的。在文档中,他们解释了调节器功能的使用就像my_f(x)一样。所以我认为我只需要实现操作符(),但实际上我需要重新实现Evaluate函数
iter cost cost_change |gradient| |step| tr_ratio tr_radius ls_iter iter_time total_time
0 4.512500e+01 0.00e+00 9.50e+00 0.00e+00 0.00e+00 1.00e+04 0 2.99e-04 1.04e-03
1 4.511598e-07 4.51e+01 9.50e-04 9.50e+00 1.00e+00 3.00e+04 1 3.84e-04 9.72e-03
2 5.012552e-16 4.51e-07 3.17e-08 9.50e-04 1.00e+00 9.00e+04 1 2.98e-05 9.92e-03
Ceres Solver Report: Iterations: 2, Initial cost: 4.512500e+01, Final cost: 5.012552e-16, Termination: CONVERGENCE
x : 0.5 -> 10
struct Conditioners : ceres::CostFunction
{
public:
Conditioners()
{
set_num_residuals(1);
mutable_parameter_block_sizes()->push_back(1);
}
~Conditioners()
{}
template<typename T>
T operator() (T x)
{
return T(x * x);
}
bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) const
{
residuals[0] = parameters[0][0] * parameters[0][0]
if (jacobians)
jacobians[0][0] = 2.0 * parameters[0][0]
return true;
}
};