从Eigen编译时间误差:THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS

时间:2014-05-08 14:02:55

标签: c++ stdvector eigen

我一直在努力编写一个实用函数来在Eigen Matrix和STL vector之间进行转换。我把我的代码浓缩为:

#include <Eigen/Dense>
#include <vector>

#include <iostream>

template <int Flags=Eigen::RowMajor, typename Derived>
std::vector<typename Derived::Scalar>
eigenToStdVector(const Eigen::EigenBase<Derived>& b)
{
  typedef typename Derived::Scalar Scalar;
  std::vector<Scalar> out(b.size());
  Eigen::Map<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic, Flags> >
    (out.data(), b.rows(), b.cols()) = b/*.derived()*/;
  return out;
}

int
main ()
{
  Eigen::MatrixXf v(2,4);
  v << 1,2,3,4,5,6,7,8;
  std::cout << v << std::endl;

  for (auto i : eigenToStdVector(v))
    std::cout << i << ' ';
  std::cout << std::endl;

  for (auto i : eigenToStdVector<Eigen::ColMajor>(v.transpose()))
    std::cout << i << ' ';
  std::cout << std::endl;

  return 0;
}

我不明白为什么包含(注释的).derived()行会导致编译成功。如果有人可以评论为什么包含这个是必要的,我将非常感激!

我正在使用GCC 4.8和Eigen 3.2.1。

1 个答案:

答案 0 :(得分:1)

您应该使用DenseBase而不是过于笼统的EigenBase基础classe。这种差异可能会在3.3中消失。