CppAD: Как построить динамический вектор, используя ссылку? - PullRequest
0 голосов
/ 06 ноября 2018

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

Насколько я знаю, обычная процедура CppAD - это установить динамический вектор a, затем вызвать Independent(a), затем выполнить некоторые вычисления, а затем определить функцию CppAD::ADFun<double> f(a,b); для построения графика между входом и output, где 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 ()? Любые предложения будут оценены.

...