CppAD: Как построить динамический вектор, используя ссылку?

У меня есть существующая кодовая база, которая выполняет некоторое преобразование координат и вычисление динамики для модели робота, я хочу добавить Cppad ко всем параметрам робота, но я столкнулся с такой проблемой:

Насколько я знаю, нормальная процедура CppAD заключается в настройке динамического вектора aзатем позвоните Independent(a), затем делает некоторые вычисления, а затем определить функцию CppAD::ADFun<double> f(a,b); построить график между входом и выходом, где b результат, который зависит от a,

Вопрос в том, что у меня есть матрица инерции M размером 3 на 3 (тип Eigen), и я хочу вычислить производные динамической переменной result размером 3, относительно только диагональных элементов 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

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …