C++ 特征:如何编写一个既可以接受常规(密集)矩阵,又可以接受对角矩阵的函数
C++ Eigen: How to write a function that can both take a regular (dense) Matrix, but also a DiagonalMatrix?
我有一个函数可以在内部执行一些线性代数,但我希望能够将常规密集矩阵以及对角矩阵(后者出于效率目的(传递到其中。我尝试了以下语法:
void bla( const Vector* v, const Eigen::MatrixBase<float>* A, Vector* out )
{
int colunms = A->cols();
....
}
但这不会编译,因为 MatrixBase 没有 cols(( 函数!
我知道DiagonalMatrix类有一个toDenseMatrix((函数,但我担心的是这涉及值的内部复制,因此会使我希望从DiagonalMatrix获得的所有优化无效。
我该怎么做?
在任何矩阵上工作的通用特征例程都应该将类模板template<typename Derived> MatrixBase
作为参数,它本身将派生自它的矩阵类作为模板参数(即,它使用 CRTP 模式(。所以基本上,你的函数应该以这样的方式设置。
template<typename Derived>
void foo(const Eigen::MatrixBase<Derived>& x)
{
//do something
}
在这个函数中,正如你所注意到的,你只能调用那些在MatrixBase
中实际可用的成员函数,而cols()
确实不可用。但是,您可以使用成员函数 innerSize
和 outerSize
,它们根据存储方案分别表现为 ''rows(( and
cols(('。在此处阅读详细信息。
但是,如果这些函数不可用,您也可以通过重载函数来获得所需的行为。例如,您可以编写一个采用矩阵并使用上述cols()
的一般例程,以及一个对角矩阵的重载,
template<typename T>
void foo(const Eigen::DiagonalMatrix<T>& x)
{
//do something for diagonal matrices
}
相关文章:
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 特征:模板函数中矩阵的平面图
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数
- 有人可以解释一下这个矩阵幂函数是如何工作的吗?
- 用矩阵将函数中的整数值替换定义的常量
- C++ :: 如何捕获由 void 函数创建的矩阵
- 给定一个 3 x 3 矩阵或任何 n x n 矩阵,为什么我的以下函数找不到对角线差异?
- 创建整数的 2D 数组,该数组将使用两个函数用随机数填充矩阵.我做错了什么?
- 避免矩阵复制构造函数
- 如何从C++中的函数返回矩阵(板)
- 如何根据传递给函数的变量定义特征矩阵大小
- LAPACKE函数中需要全矩阵或三角形部分进行对角化?
- 将动态数组/矩阵传递给函数进行初始化
- 用于平铺矩阵乘法的 AVX 内部函数
- 从固定函数迁移到 GLSL OpenGL:我应该如何修改我的视图(lookAt)矩阵和透视矩阵?
- 如何在 constexpr 构造函数中初始化矩阵一次?
- 将函数应用于特征矩阵中的所有元素,而无需循环
- 索引和访问 mex 函数中单元数组和矩阵的元素
- C 错误将参数重新发送到模板函数(矩阵参数)
- 使用未定义它们的构造函数(矩阵(int,int))给出atribute 值