Eigen的AutoDiffJacobian,需要一些帮助才能使学习示例正常工作 [英] Eigen's AutoDiffJacobian, need some help getting a learning example to work

查看:156
本文介绍了Eigen的AutoDiffJacobian,需要一些帮助才能使学习示例正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在使用Eigen的AutoDiffScalar取得了很大的成功,现在我想转到AutoDiffJacobian,而不是自己一个人做。因此,在研究了AutoDiffJacobian.h之后,我创建了一个学习示例,但是出了点问题。

I have been using Eigen's AutoDiffScalar with much success and would now like to go over to the AutoDiffJacobian instead of doing this over by myself. Hence I created a learning example after have studied the AutoDiffJacobian.h, but something is wrong.

Functor:

template <typename Scalar>
struct adFunctor
{
  typedef Eigen::Matrix<Scalar, 3, 1> InputType;
  typedef Eigen::Matrix<Scalar, 2, 1> ValueType;
  typedef Eigen::Matrix<Scalar,
                        ValueType::RowsAtCompileTime,
                        InputType::RowsAtCompileTime> JacobianType;

  enum {
    InputsAtCompileTime = InputType::RowsAtCompileTime,
    ValuesAtCompileTime = ValueType::RowsAtCompileTime
  };

  adFunctor() {}

  size_t inputs() const { return InputsAtCompileTime; }

  void operator() (const InputType &input,
                   ValueType *output) const
  {
    Scalar s1 = Scalar(0), s2 = Scalar(0);

    /* Some operations to test the AD. */
    for (int i = 0; i < 3; i++)
    {
      s1 += log(input(i));
      s2 += sqrt(input(i));
    }

    (*output)(0) = s1;
    (*output)(1) = s2;
  }
};

用法:

Eigen::Matrix<double, 3, 1> in;
in << 1,2,3;
Eigen::Matrix<double, 2, 1> out;
Eigen::AutoDiffJacobian< adFunctor<double> > adjac;
adjac(in, &out);

从中收到的错误如下:

/usr/include/eigen3/unsupported/Eigen/src/AutoDiff/AutoDiffJacobian.h: In instantiation of ‘void Eigen::AutoDiffJacobian<Functor>::operator()(const InputType&, Eigen::AutoDiffJacobian<Functor>::ValueType*, Eigen::AutoDiffJacobian<Functor>::JacobianType*) const [with Functor = adFunctor<double>; Eigen::AutoDiffJacobian<Functor>::InputType = Eigen::Matrix<double, 3, 1>; Eigen::AutoDiffJacobian<Functor>::ValueType = Eigen::Matrix<double, 2, 1>; Eigen::AutoDiffJacobian<Functor>::JacobianType = Eigen::Matrix<double, 2, 3, 0, 2, 3>]’:
/home/emifre/Git/autodiff-test/src/autodiff_test.cpp:55:17:   required from here
/usr/include/eigen3/unsupported/Eigen/src/AutoDiff/AutoDiffJacobian.h:69:24: error: no matching function for call to ‘Eigen::AutoDiffJacobian<adFunctor<double> >::operator()(Eigen::AutoDiffJacobian<adFunctor<double> >::ActiveInput&, Eigen::AutoDiffJacobian<adFunctor<double> >::ActiveValue*) const’
     Functor::operator()(ax, &av);
     ~~~~~~~~~~~~~~~~~~~^~~~~~~~~
/home/emifre/Git/autodiff-test/src/autodiff_test.cpp:27:8: note: candidate: void adFunctor<Scalar>::operator()(const InputType&, adFunctor<Scalar>::ValueType*) const [with Scalar = double; adFunctor<Scalar>::InputType = Eigen::Matrix<double, 3, 1>; adFunctor<Scalar>::ValueType = Eigen::Matrix<double, 2, 1>]
   void operator() (const InputType &input,
        ^~~~~~~~
/home/emifre/Git/autodiff-test/src/autodiff_test.cpp:27:8: note:   no known conversion for argument 2 from ‘Eigen::AutoDiffJacobian<adFunctor<double> >::ActiveValue* {aka Eigen::Matrix<Eigen::AutoDiffScalar<Eigen::Matrix<double, 3, 1> >, 2, 1, 0, 2, 1>*}’ to ‘adFunctor<double>::ValueType* {aka Eigen::Matrix<double, 2, 1>*}’

从此错误看来我有点不知所措在AutoDiffJacobian.h中第二次调用函子时,没有为我的函子使用正确的类型,但第一次调用它起作用。
我希望这里的人知道为什么并且可以提供帮助,也许我只是误解了

From this error it seems that I am somehow not having the correct types for my functor for the second call to the functor in AutoDiffJacobian.h, but the first call to it works. I hope someone here has an idea why and can help, maybe I have just misunderstood the usage.

编辑:显示该问题的可编译示例:

#include <Eigen/Dense>
#include <unsupported/Eigen/AutoDiff>

/*
 * Testing differentiation that will produce a Jacobian, using functors and the
 * AutoDiffJacobian helper.
 */

template <typename Scalar>
struct adFunctor
{
  typedef Eigen::Matrix<Scalar, 3, 1> InputType;
  typedef Eigen::Matrix<Scalar, 2, 1> ValueType;
  typedef Eigen::Matrix<Scalar,
                        ValueType::RowsAtCompileTime,
                        InputType::RowsAtCompileTime> JacobianType;

  enum {
    InputsAtCompileTime = InputType::RowsAtCompileTime,
    ValuesAtCompileTime = ValueType::RowsAtCompileTime
  };

  adFunctor() {}

  size_t inputs() const { return InputsAtCompileTime; }

  void operator() (const InputType &input,
                   ValueType *output) const
  {
    Scalar s1 = Scalar(0), s2 = Scalar(0);

    /* Some operations to test the AD. */
    for (int i = 0; i < 3; i++)
    {
      s1 += log(input(i));
      s2 += sqrt(input(i));
    }

    (*output)(0) = s1;
    (*output)(1) = s2;
  }
};



int main(int argc, char *argv[])
{
  Eigen::Matrix<double, 3, 1> in;
  in << 1,2,3;
  Eigen::Matrix<double, 2, 1> out;
  Eigen::AutoDiffJacobian< adFunctor<double> > adjac;
  adjac(in, &out);

  return 0;
}


推荐答案

Okey,经过很多次测试我让它正常工作。
只是我误解了编译器所说的错误,直截了当地说,我缺少运算符本身的模板。

Okey, after a lot of testing I got it to work. It was just me misunderstanding the error from the compiler that said it straight out, I was missing the template for the operator itself.

它只需要更改为:

template <typename T1, typename T2>
void operator() (const T1 &input, T2 *output) const

现在它像一种对待!我希望有比我更多的人使用此功能。

Now it works like a treat! I hope someone more than me has usage of this.

这篇关于Eigen的AutoDiffJacobian,需要一些帮助才能使学习示例正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆