我有一个内部执行线性代数的函数,但我希望能够将常规密集矩阵传递给它,以及对角矩阵(后者用于提高效率)。 我尝试了以下语法:
void bla( const Vector* v, const Eigen::MatrixBase<float>* A, Vector* out )
{
int colunms = A->cols();
....
}
但由于MatrixBase没有cols()函数,因此无法编译!
我知道DiagonalMatrix类有一个toDenseMatrix()函数,但我担心的是涉及内部复制值,因此会使我希望从DiagonalMatrix获得的所有优化都无效。
我该怎么做?
答案 0 :(得分:1)
处理任何矩阵的一般Eigen例程应该将类模板template<typename Derived> MatrixBase
作为参数,它本身将从中派生的矩阵类作为模板参数(即,它使用CRTP模式)。所以基本上,你的功能应该像
template<typename Derived>
void foo(const Eigen::MatrixBase<Derived>& x)
{
//do something
}
在这个函数中,正如您所注意到的那样,您只能调用MatrixBase
中实际可用的成员函数,而cols()
确实不可用。但是,您可以使用成员函数innerSize
和outerSize
,它们分别根据存储方案表现为``rows()and
cols()`。阅读详细信息here。
但是如果这些功能不可用,您还可以通过重载功能获得所需的行为。例如,您可以编写一个使用矩阵的常规例程,并使用上面的cols()
和对角矩阵的一个重载,
template<typename T>
void foo(const Eigen::DiagonalMatrix<T>& x)
{
//do something for diagonal matrices
}