ceres::Problem problem; problem.Evaluate(ceres::Problem::EvaluateOptions(), nullptr, nullptr, nullptr, &jacobian);Evaluate参数
时间: 2024-04-05 14:32:29 浏览: 105
ceres::Problem::Evaluate函数的参数含义如下:
1. options:一个EvaluateOptions类型的对象,用于设置计算参数。如果不需要设置,可以传入默认构造的EvaluateOptions对象。
2. residuals:指向一个double类型的数组,用于输出问题中每个残差的值。如果不需要输出残差值,可以传入空指针。
3. gradients:指向一个double类型的数组,用于输出问题中每个残差对每个参数的偏导数(即雅克比矩阵)。如果不需要输出雅克比矩阵,可以传入空指针。
4. jacobians:指向一个std::vector类型的对象,用于输出问题中每个残差对每个参数的偏导数(即雅克比矩阵)。与gradients参数类似,如果不需要输出雅克比矩阵,可以传入空指针。
需要注意的是,gradients和jacobians这两个参数只能同时为nullptr或者同时为非nullptr。如果同时输出残差值和雅克比矩阵,则需要同时传入非nullptr的residuals和jacobians参数。
相关问题
ceres::Problem problem; problem.Evaluate 函数参数说明
ceres::Problem::Evaluate函数的参数如下:
1. options:一个EvaluateOptions类型的对象,用于设置计算参数。如果不需要设置,可以传入默认构造的EvaluateOptions对象。
2. residuals:指向一个double类型的数组,用于输出问题中每个残差的值。如果不需要输出残差值,可以传入空指针。
3. gradients:指向一个double类型的数组,用于输出问题中每个残差对每个参数的偏导数(即雅克比矩阵)。如果不需要输出雅克比矩阵,可以传入空指针。
4. local_parameterizations:一个指向LocalParameterization类型的数组,用于指定每个参数的局部参数化方法。如果不需要局部参数化,可以传入空指针。
5. jacobians:指向一个std::vector类型的对象,用于输出问题中每个残差对每个参数的偏导数(即雅克比矩阵)。与gradients参数类似,如果不需要输出雅克比矩阵,可以传入空指针。
需要注意的是,gradients和jacobians这两个参数只能同时为nullptr或者同时为非nullptr。如果同时输出残差值和雅克比矩阵,则需要同时传入非nullptr的residuals和jacobians参数。
此外,如果需要使用局部参数化方法,需要在Problem::AddParameterBlock函数中指定相应的参数化方法。在Problem::Evaluate函数中,需要传入与问题中参数个数相同的LocalParameterization对象,用于计算局部参数化后的残差和雅克比矩阵。
ceres::Problem problem;problem.AddResidualBlock 其中AddResidualBlock如何定义vector
AddResidualBlock方法的最后一个参数是一个vector,用于指定该Residual Block所涉及的所有参数的索引。
具体来说,AddResidualBlock方法的定义如下:
```cpp
void AddResidualBlock(
CostFunction* cost_function,
LossFunction* loss_function,
const std::vector<ceres::ResidualBlockId>& parameter_block_ids,
const ceres::ResidualBlockOptions& options = ceres::ResidualBlockOptions());
```
其中,第三个参数`parameter_block_ids`就是一个vector,用于指定该Residual Block所涉及的所有参数的索引。这个vector中的每个元素都是一个`ResidualBlockId`类型的对象,表示某个参数块的编号。
例如,如果我们要定义一个包含3个参数块的Residual Block,其中第一个参数块的大小是3,第二个参数块的大小是2,第三个参数块的大小是4,那么可以这样写:
```cpp
// 定义3个参数块,分别为3维、2维、4维
double x1[3] = {1.0, 2.0, 3.0};
double x2[2] = {4.0, 5.0};
double x3[4] = {6.0, 7.0, 8.0, 9.0};
// 将这些参数块添加到Problem对象中
ceres::Problem problem;
ceres::ResidualBlockId id1 = problem.AddParameterBlock(x1, 3);
ceres::ResidualBlockId id2 = problem.AddParameterBlock(x2, 2);
ceres::ResidualBlockId id3 = problem.AddParameterBlock(x3, 4);
// 定义一个CostFunction,并将其添加到Problem对象中
MyCostFunction* cost_function = new MyCostFunction();
ceres::ResidualBlockId residual_block_id;
problem.AddResidualBlock(cost_function, NULL, {id1, id2, id3}, &residual_block_id);
```
在上面的代码中,我们首先定义了3个参数块,然后将它们分别添加到Problem对象中,并分别得到了它们的编号`id1`、`id2`、`id3`。最后,我们定义了一个包含这3个参数块的Residual Block,并将其添加到Problem对象中。注意,我们使用了C++11的语法,通过花括号来初始化vector。
阅读全文