前言:
现在朋友们对“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;