0

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

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

但这不会编译,因为 MatrixBase 没有 cols() 函数!

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

我该怎么办?

4

1 回答 1

1

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

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

正如您所注意到的,在此函数中,您只能调用那些在 中实际可用MatrixBasecols()确实不可用的成员函数。但是,您可以使用成员函数innerSizeouterSize,这取决于存储方案,它们分别表现为“rows() andcols()”。在此处阅读详细信息。

但是,如果这些函数不可用,您也可以通过重载函数来获得所需的行为。例如,您可以编写一个通用例程,采用cols()上述矩阵并使用,以及对角矩阵的一个重载,

  template<typename T>
  void foo(const Eigen::DiagonalMatrix<T>& x)
  {
      //do something for diagonal matrices
  }
于 2014-10-21T00:12:36.340 回答