You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ceres Solver中为CostFunction设置参数块大小?

在Ceres中使用CostFunction替代SizedCostFunction的实现方法

要在运行时动态设置参数块大小,你需要直接继承ceres::CostFunction,并在类的构造函数中完成两项核心配置:

  • 用set_num_residuals()指定残差数量
  • 用mutable_parameter_block_sizes()->push_back()逐个添加参数块的大小(支持多参数块场景)

修改后的代码示例如下:

class QuadraticCostFunction : public ceres::CostFunction {
public:
    // 构造函数接收参数块大小,实现动态配置
    QuadraticCostFunction(int param_block_size) {
        set_num_residuals(1); // 设置残差数量为1
        // 添加参数块,大小由传入的param_block_size决定
        mutable_parameter_block_sizes()->push_back(param_block_size);
    }

    bool Evaluate(double const* const* parameters,
                  double* residuals,
                  double** jacobians) const override {
        double x = parameters[0][0];
        residuals[0] = 10 - x;
   
        if (jacobians != nullptr && jacobians[0] != nullptr) {
            // 雅可比矩阵维度为「残差数 × 参数块大小」,此处按单参数逻辑赋值
            jacobians[0][0] = -1;
            // 若参数块更大,需根据实际残差函数的导数逻辑填充对应位置
        }
        return true;
    }
};

关键说明

  1. 参数块配置:mutable_parameter_block_sizes()返回一个vector<int>的指针,你可以通过push_back添加任意数量、任意大小的参数块,完全支持运行时动态设置。
  2. 实例化方式:使用时根据实际参数大小创建对象,比如new QuadraticCostFunction(1)就对应原示例中的1维参数场景。
  3. 雅可比矩阵处理:如果参数块大小动态变化,需要在Evaluate中根据当前参数块的大小来填充雅可比矩阵的对应元素,确保维度匹配。

内容的提问来源于stack exchange,提问作者zenzu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:35:13