1 使用矩阵作为函数参数介绍
文章来源Writing Functions Taking %Eigen Types as Parameters
Eigen为了在函数中传递不同的类型使用了表达式模板技术。如果你传递一个表达式到函数时使用了Matrix作为参数,你的表达式会被隐含的作为Matrix模板传递给这个函数。这意味着你丢掉了表达式模板所带来的好处,这有如下两个缺点:
- 评估进模板的参数可能是无用或者无效的。
- 这只允许函数从表达式中读取而无法写入。
幸运的是这些表达式类型都有一个共同特点就是他们都继承于几个通用的、模板化的基类。通过让你的函数使用这些基类作为模板参数,你可以让它们很好的和表达式模板结合。
2 一些简单的例子
这一段将会提供一些简单的例子用来说明Eigen中提供的几种不同类型对象。在开始介绍这些例子之前,我们首先需要概括如何使用这些基类(当然也可以查看官方的手册类的层次)。
- MatrixBase: 它是所有稠密矩阵表达式的基类(和array表达式、稀疏矩阵表达式、特殊矩阵表达式相对应)。在函数中使用它作为参数意味着它只能传递稠密矩阵。
- ArrayBase: 它是稠密array表达式的基类(和matrix表达式相对应等)。在函数中使用它作为参数意味着它只能传递array.
- DenseBase: 它是所有密集表达式的基类,也就是说它包含了MatrixBase和ArrayBase.它可以作为函数参数传递matrices和arrays.
- EigenBase: 它是所有矩阵表达式统一的基类,它可以被应用在矩阵或者arrays,比如特殊矩阵(比如对角矩阵、转置矩阵等).它被应用在函数中作为参数意味着所有这种类型的参数都可以被传递。
2.1 EigenBase使用例程
打印Eigen中通用对象的维数。它可能是任何形式的矩阵表达式,任何稠密或稀疏或array的形式。
#include "Eigen/Core"
#include "iostream"
using namespace Eigen;
using namespace std;
template <typename Derived>
void print_size(const EigenBase<Derived>& b)
{
cout<<"size(rows,cols):"<<b.size()<<" ("<<b.rows()
<<","<<b.cols()<<")"<<std::endl;
}
int main()
{
Vector3f v;
print_size(v);
//v.asDiagonal()returns a 3x3 diagonal matrix pseudo-expression
print_size(v.asDiagonal());
}
执行结果如下:
size(rows,cols):3 (3,1)
size(rows,cols):9 (3,3)
2.2 DenseBase使用示例
打印一个稠密表达式的子块,接收任何稠密matrix和array表达式。但是稀疏类型和特殊类型的matrix类(如DiagonalMatrix)不能接收。
#include "Eigen/Core"
#include "iostream"
using namespace Eigen;
using namespace std;
template<typename Derived>
void print_block(const DenseBase<Derived>& b,int x,int y,int r,int c)
{
cout<<"block:\n"<<b.block(x,y,r,c)<<endl;
}
int main()
{
Matrix3f v;
v<< 1,2,3,
4,5,6,
7,8,9;
print_block(v,1,1,2,2);
}
执行结果如下:
block:
5 6
8 9