У меня есть существующая кодовая база, которая выполняет некоторое преобразование координат и вычисление динамики для модели робота, я хочу добавить 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 ()? Любые предложения будут оценены.