栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Eigen库的学习(一)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Eigen库的学习(一)

由于以后要用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或更小的固定大小的矩阵。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/928749.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号