龙空技术网

Eigen 菜鸟教程(一)

张麟博士 63

前言:

现在朋友们对“eigen函数”都比较注意,兄弟们都需要学习一些“eigen函数”的相关资讯。那么小编也在网摘上网罗了一些有关“eigen函数””的相关知识,希望咱们能喜欢,各位老铁们快快来了解一下吧!

导读:无论是做图像识别,还是做科学计算,矩阵的基本运算是必须的。实际上,在这些算法里,最核心的性能消耗也都在这些矩阵的求逆中。

Eigen作为一个比较优秀的代数运算库,是被tensorflow采用的,所以,我暂时也选择这个库作为我们有限元计算的基本代数库。

以下是一些基本操作的记录,也算是一个菜鸟教程

本版本为Eigen3.4.0. 和3.3.x相比,3.4融入了c++11的很多特性。在一些数据的检查上也做了很多工作。

1、Eigen如何定义矩阵?

Eigen的所有类型的矩阵,都是通过Matrix模板来定义的。

Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

里面有三个参数:

Scalar, 矩阵中存放的数据的值的类型,这里必须是单值。

RowsAtComplieTime, 行数

ColsAtCompileTime,列数

以下是内部重定义的三个类型,含义是很清晰的。

typedef Matrix<float, 4, 4> Matrix4f; ?// 4x4  floattypedef Matrix<float, 3, 1> Vector3f;  //3x1 floattypedef Matrix<int, 1, 2> RowVector2i; //1x2 inttypedef Matrix<double, Dynamic, Dynamic> MatrixXd; //动态定义的double值矩阵
	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);

直接使用这些重定义的类型就可以很方便的定义矩阵。

赋值方式,除了给定之外,也可以

	Eigen::Matrix<double, 2, 3> b;	b<< 2, 3, 4,		5, 6, 7 ;Eigen::VectorXd a(3);	a<<1.5, 2, 2.5;

2、基本操作

(1)数值运算 + - * /

	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);	std::cout << m << std::endl;	MatrixXd m1(2, 2);	m1(0, 0) = 3;	m1(1, 0) = 2.5;	m1(0, 1) = -1;	m1(1, 1) = m1(1, 0) + m1(0, 1);	std::cout << m1 << std::endl;	std::cout << m - m1 << std::endl; //矩阵+	std::cout << m + m1 << std::endl; // 矩阵 -	std::cout << m*100 << std::endl;  // 数乘	std::cout << m /100 << std::endl;  //数除

(2)转置、共轭、伴随

transpose, conjugate,adjoint

三个函数完成这三个工作

MatrixXcf a = MatrixXcf::Random(2,2);cout << "Here is the matrix a\n" << a << endl; cout << "Here is the matrix a^T\n" << a.transpose() << endl;  cout << "Here is the conjugate of a\n" << a.conjugate() << endl;  cout << "Here is the matrix a^*\n" << a.adjoint() << endl;

标签: #eigen函数 #eigen算法