CppAD:如何使用参考构建动态矢量?

时间:2018-11-05 23:11:42

标签: c++ reference eigen autodiff

我有一个现有的代码库,可以对机器人模型进行一些坐标转换和动力学计算,我希望将Cppad添加到所有机器人参数中,但是遇到了这样的问题:

据我所知,正常的CppAD过程是建立动态向量a,然后调用Independent(a),然后进行一些计算,然后定义一个函数CppAD::ADFun<double> f(a,b);来构建在输入和输出之间的图形上,其中b是取决于a的结果。

问题是,假设我有一个3乘3的惯性矩阵M(本征类型),我想计算一个3的动力学变量result的导数,仅关注M的对角线元素(因此有3个)。从M到D的计算都在代码库中完成,而我所做的有点像

Eigen::Matrix<Scalar, Eigen::Dynamic, 1> AD_M(3);      //input, or parameter of the function
Eigen::Matrix<Scalar, Eigen::Dynamic, 1> AD_result(3); //output, or the value of the function
AD_M << M(0,0), M(1,1), M(2,2); // only taking the diagonal values
Independent(AD_M);
... compute()    //some function that calculates AD_result.
CppAD::ADFun<double> f(AD_M,AD_result);
f.jacobian(x_M); // x_M is some initialize parameter of M

当我这样做时,我得到了雅可比行列的所有零输出。我认为这样做的原因是,通过进行AD_M << M(0,0), M(1,1), M(2,2);我实际上是在复制M(0,0), M(1,1), M(2,2),而不是实际引用或对其进行浅表复制。函数compute()从原始M取值,而不是基于AD_M构建图,所以所有的雅各布都为0。

有人可以告诉我是否有可能使用引用来构建动态数组,或者如何针对这种情况进行其他工作吗?还是就像我知道某个参数的地址一样,如何使用这些地址到ADfun()函数构造一个动态数组?任何建议将不胜感激。

0 个答案:

没有答案