由于以后要用C++进行数值计算的编程,难免离不开矩阵计算,因为Eigen库的使用比较简洁,所以抽出几天时间学习了一下Eigen库。主要的学习来源是Eigen库的官网,由于是纯英文版本,所以我又重新根据自己的需要边翻译边学习。
开始这是一个非常简短指引,它将教会你怎样使用Eigen。它有双重目的。它可以为那些想要尽快开始代码的人提供了对Eigen库使用的最少介绍。你也可以阅读这章作为教程的第一部分,它详细解释了库;在这种情况下,你将继续学习矩阵类(第二章第一节)。
怎样安装Eigen?Eigen的安装很简单。可以参看我的教程:https://blog.csdn.net/m0_63111108/article/details/124758977?spm=1001.2014.3001.5502
第一个简单的程序这里有一个非常简单的程序给你开始:
#include#include using namespace std; using namespace Eigen; int main() { MatrixXd m(2, 2); m(0, 0) = 3; m(1, 0) = 2.5; m(0, 1) = -1; m(1, 1) = m(1, 0) + m(0, 1); cout << m << endl; return 0; }
在告诉你怎么编译之前,我先解释一下这个程序。
编译和运行你第一个程序没有可连接的库。在编译上述程序时,唯一需要记住的是,编译器必须能够找到Eigen头文件。放置Eigen源代码的目录必须在include路径中。我们这里采用VS2022来实现编译和运行的,具体看上述安装教程。
运行结果:
讲解第一个程序Eigen的头文件定义了很多类型,但是对于简单的应用,只需要用 MatrixXd 类型就足以。这代表一个任意大小的矩阵(即,MatrixXd中的X),其中每一项都是double型的(即,MatrixXd中的d)。可以用来表示矩阵的不同类型的概述,请参阅快速参考指南。
Eigen/Dense头文件定义了MatrixXd类型以及相关类型(参看头文件表)的所有成员函数。在这个头文件里的所有类和函数都是定义在Eigen 空间里。
main函数的第一行,声明了一个类型为 MatrixXd 的变量m,并指定它是一个两行两列的矩阵(没有初始化)。m(0,0) = 3 将左上角元素设定为3。你需要用圆括号来引用矩阵中的项。通常在计算机科学中,第一个索引的索引是0,与数学中第一个索引为1的惯例是相反的。
下面三条居于设置其他的三个项。最后一行将矩阵m输出到标准输出流。
举例2:矩阵与向量这是另一个例子,它结合了矩阵和向量。先看第一个程序,再看第二个程序。
运行时设置大小:
#include#include using namespace std; using Eigen::MatrixXd; using Eigen::VectorXd; int main() { MatrixXd m = MatrixXd::Random(3, 3); // Random(x,y): get a x*y random matrix in (-1,1). cout << " m = " << endl << m << endl; MatrixXd n = MatrixXd::Constant(3, 3, 1.2); // Constant(x,y,a): get a x*y matrix in all a. cout << " n = " << endl << n << endl; m = (m + n) * 50; cout << " m = " << endl << m << endl; VectorXd v(3); // VectorXd(a): get a a*1 vector. v << 1, 2, 3; // Comma operator cout << " v = " << endl << v << endl; cout << " m*v = " << endl << m * v << endl; return 0; }
编译时设置大小:
#include讲解第二个例子#include using namespace std; using Eigen::Matrix3d; using Eigen::Vector3d; int main() { Matrix3d m = Matrix3d::Random(); m = (m + Matrix3d::Constant(1.2)) * 50; cout << " m = " << endl << m << endl; Vector3d v(1, 2, 3); cout << " v = " << endl << v << endl; return 0; }
第二个实例首先声明一个3x3矩阵m,它使用随机函数初始化,随机数值在-1到1之间。下一行使用线性映射,使值在10到110之间。函数调用MatrixXd::Constant(3,3,1.2),返回一个3x3的矩阵,其值全是1.2。剩余代码都是标准运算。main函数的下一行引入了一个新类型:VectorXd。这表示任意大小的列向量。这里,向量v被创建为包含3个未初始化的系数。最后一行使用了所谓的逗号运算符来设置向量v的所有系数。
现在,回头看看第二个示例程序。我们展示了两个版本。在第一个版本中,矩阵的类型是MatrixXd,表示任意大小的矩阵。第二个版本与此类似,只是矩阵的类型是Matrix3d,它表示固定大小的矩阵(这里是3x3)。因为类型已经对矩阵的大小进行了编码,所以没有必要在构造函数中指定矩阵的大小,比较MatrixXd m(3,3)和Matrix3d m。类似地,我们有VectorXd(任意大小)和Vector3d(固定大小)。注意,这里向量v的系数是直接在构造函数中设置的,尽管也可以使用第一个示例的相同语法。
使用固定大小的矩阵和向量有两个优点。编译器会发生更好(更快)的代码,因为它知道矩阵和向量的大小。在类型中指定大小还允许在编译时进行更严格的检查。例如,如果试图将Matrix4d(4 x 4)与Vector3d(3x1)相乘,编译器将会抱怨。但是,使用多种类型会增加编译时间和可执行文件的大小。在编译时也可能不知道矩阵的大小。经验法则是使用大小为4x4或更小的固定大小的矩阵。



