10 #ifndef EIGEN_AUTODIFF_JACOBIAN_H
11 #define EIGEN_AUTODIFF_JACOBIAN_H
16 template<
typename Functor>
class AutoDiffJacobian :
public Functor
19 AutoDiffJacobian() : Functor() {}
20 AutoDiffJacobian(
const Functor& f) : Functor(f) {}
24 AutoDiffJacobian(
const T0& a0) : Functor(a0) {}
25 template<
typename T0,
typename T1>
26 AutoDiffJacobian(
const T0& a0,
const T1& a1) : Functor(a0, a1) {}
27 template<
typename T0,
typename T1,
typename T2>
28 AutoDiffJacobian(
const T0& a0,
const T1& a1,
const T2& a2) : Functor(a0, a1, a2) {}
31 InputsAtCompileTime = Functor::InputsAtCompileTime,
32 ValuesAtCompileTime = Functor::ValuesAtCompileTime
35 typedef typename Functor::InputType InputType;
36 typedef typename Functor::ValueType ValueType;
37 typedef typename Functor::JacobianType JacobianType;
38 typedef typename JacobianType::Scalar Scalar;
39 typedef typename JacobianType::Index Index;
41 typedef Matrix<Scalar,InputsAtCompileTime,1> DerivativeType;
42 typedef AutoDiffScalar<DerivativeType> ActiveScalar;
45 typedef Matrix<ActiveScalar, InputsAtCompileTime, 1> ActiveInput;
46 typedef Matrix<ActiveScalar, ValuesAtCompileTime, 1> ActiveValue;
48 void operator() (
const InputType& x, ValueType* v, JacobianType* _jac=0)
const
53 Functor::operator()(x, v);
57 JacobianType& jac = *_jac;
59 ActiveInput ax = x.template cast<ActiveScalar>();
60 ActiveValue av(jac.rows());
62 if(InputsAtCompileTime==Dynamic)
63 for (Index j=0; j<jac.rows(); j++)
64 av[j].derivatives().resize(this->inputs());
66 for (Index i=0; i<jac.cols(); i++)
67 ax[i].derivatives() = DerivativeType::Unit(this->inputs(),i);
69 Functor::operator()(ax, &av);
71 for (Index i=0; i<jac.rows(); i++)
73 (*v)[i] = av[i].value();
74 jac.row(i) = av[i].derivatives();
83 #endif // EIGEN_AUTODIFF_JACOBIAN_H