Eigen 是一个基于C++的线性代数库,其中实现大量常用的线性代数算法,包括常规矩阵计算,矩阵变换,矩阵分解,矩阵块操作。Eigen 广泛地应用在开源项目中,例如OpenCV,PCL(Point Cloud Library),ROS等。其实Eigen中算法都可以在matlab中找到,但是由于matlab是半开源的。所以,如果想在自己的项目中使用,还是要义无反顾地选择Eigen。Eigen目前的版本是3.3.4(2018.4.21)。
来看Eigen官网的第一个例子:
1 #include <iostream> 2 #include <eigen3/Eigen/Dense> 3 4 using Eigen::MatrixXd; 5 6 int main(int argc ,char** argv) 7 { 8 MatrixXd:: m(2,2); 9 m(0,0) = 3; 10 m(1,0) = 2.5; 11 m(0,1) = -1; 12 m(1,1) = m(1,0) + m(0,1); 13 std::cout<<m<<std::endl; 14 return 0; 15 }
首先,代码引入了eigen的头文件,这里Eigen/Dense 一次引入了多个常用的模块。
程序首先定义了一个2 x 2的矩阵。根据Eigen的定义 ,MatrixXd,这个类型可以拆成三部分来看,Matrix-X-d,Matrix表示定义的是一个矩阵,X表示定义的矩阵维度不确定,d表示double,指矩阵中每一个元素都是double类型的。m(2,2)指定了矩阵的大小是2x2的。从第9 行到第12 行则为矩阵中的元素进行了赋值操作。
最后输出矩阵。
在系统中运行输出如下:
来看第二个例子,区分一下矩阵(Matrix)和向量(Vector)的区别:
1 #include <iostream> 2 #include <eigen3/Eigen/Dense> 3 4 using namespace Eigen; 5 uisng namespace std; 6 7 int main(int argc ,char** argv) 8 {
// 创建一个3 x 3的随机矩阵,每个元素的范围都在(-1,1)之间 9 MatrixXd m = MatrixXd::Random(3,3);
// 将每个元素的范围设置在 (10,110)之间,MatrixXd::Cosntant() 用于产生每个元素都相同的矩阵,这里每个元素都是1.2 10 m = (m + MatrixXd::Constant(3,3,1.2)) * 50; 11 cout<<"m="<<endl<<m<<endl;
//创建一个长度为 3 的向量, 12 VectorXd v(3);
//为向量元素赋值,这里Eigen 将 << 操作符重载了。 13 v<<1,2,3;
//矩阵和向量做乘法并输出结果
14 cout<<"m*v"<<m*v<<endl; 15 16 return 0; 17 }
运行结果如下:
上面的例子展示生成矩阵和向量的不同方法,其实向量就是列数为1 的矩阵。