gpt4 book ai didi

C++ Eigen : How to write a function that can both take a regular (dense) Matrix, 还是 DiagonalMatrix?

转载 作者:行者123 更新时间:2023-11-28 06:37:58 25 4
gpt4 key购买 nike

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

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

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

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

我该怎么做?

最佳答案

适用于任何矩阵的通用 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
}

关于C++ Eigen : How to write a function that can both take a regular (dense) Matrix, 还是 DiagonalMatrix?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26476008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com