C ++ Eigen:如何编写一个既可以采用常规(密集)矩阵也可以采用DiagonalMatrix的函数?

时间:2014-10-20 22:30:59

标签: c++ eigen eigen3

我有一个内部执行线性代数的函数,但我希望能够将常规密集矩阵传递给它,以及对角矩阵(后者用于提高效率)。 我尝试了以下语法:

void bla( const Vector* v, const Eigen::MatrixBase<float>* A, Vector* out )
{
  int colunms = A->cols();
  ....
}

但由于MatrixBase没有cols()函数,因此无法编译!

我知道DiagonalMatrix类有一个toDenseMatrix()函数,但我担心的是涉及内部复制值,因此会使我希望从DiagonalMatrix获得的所有优化都无效。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

处理任何矩阵的一般Eigen例程应该将类模板template<typename Derived> MatrixBase作为参数,它本身将从中派生的矩阵类作为模板参数(即,它使用CRTP模式)。所以基本上,你的功能应该像

那样设置
  template<typename Derived>
  void foo(const Eigen::MatrixBase<Derived>& x)
  {
      //do something
  }

在这个函数中,正如您所注意到的那样,您只能调用MatrixBase中实际可用的成员函数,而cols()确实不可用。但是,您可以使用成员函数innerSizeouterSize,它们分别根据存储方案表现为``rows()and cols()`。阅读详细信息here

但是如果这些功能不可用,您还可以通过重载功能获得所需的行为。例如,您可以编写一个使用矩阵的常规例程,并使用上面的cols()和对角矩阵的一个重载,

  template<typename T>
  void foo(const Eigen::DiagonalMatrix<T>& x)
  {
      //do something for diagonal matrices
  }