Eigen是一个高效率的c++矩阵运算库,tensorflow等一系列开源框架都是用它来进行高效率的代数运算。如果你还没安装Eigen,那么亲参考Ubuntu下如何安装与使用cmake编译Eigen。
0. 入门
- 如果你不清楚如何使用cmake请参考Ubuntu下cmake教程实践从入门到会用。
- 如果你不清楚引入Eigen头文件时CMakeLists.txt需要写什么内容请参考Ubuntu下如何安装与使用cmake编译Eigen。
1. 定义一个矩阵变量并赋值
注意Eigen中的矩阵要提前告诉程序各元素的数据类型(如果你不告诉它各元素是什么类型它默认是double类型)。比如你申明矩阵各个元素是int,然后你给矩阵某个元素赋值是1.3,它会变成1。
#include<iostream>
#include <Eigen/Core>
// 求特征值,逆矩阵要用
#include<Eigen/Dense>
int main()
{
// 定义一个2×3的float矩阵
// (注意每个元素都是float,有一个int就会报错)
// Eigen中所有矩阵类型都市Matrix,
// 它是一个模板类。模板的三个参数为<元素类型,行数,列数>
Eigen::Matrix<int, 2, 3> matrix_23;
// 给矩阵赋值它会自动变成2行3列的矩阵
matrix_23 << 1.3,2,3,4,5,6;
cout << matrix_23 <<endl;
// 定义一个三维的向量(默认各元素是double类型)
// 它等价于Eigen::Matrix<double,3,1> v1_3d;
Eigen::Vector3d v1_3d;
Eigen::Vector3d v2_3d;
v1_3d << 1,2,3;
v2_3d << 3,4,5;
return 0;
}
注意Eigen预定义矩阵最大是50行50列。如果比这个还大或者不知道行数那就得用使用它的动态矩阵。
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > matrix_dynamic;
2. 矩阵乘法
注意矩阵乘法两个矩阵各元素类型一定要一样不然会报错。比如有个矩阵各元素类型是int,另外一个是float那么会报错。
#include<iostream>
using namespace std;
#include <Eigen/Core>
// 求特征值,逆矩阵要用
#include<Eigen/Dense>
int main()
{
Eigen::Matrix<double, 2, 3> matrix_23;
// 给矩阵赋值它会自动变成2行3列的矩阵
matrix_23 << 1.3,2,3,4,5,6;
// 定义一个三维的向量(默认各元素是double类型)
// 它等价于Eigen::Matrix<double,3,1> v1_3d;
Eigen::Vector3d v1_3d;
v1_3d << 1,2,3;
// 这个就是矩阵乘法
cout << matrix_23*v1_3d << endl;
return 0;
}
3. 根据下标访问矩阵的元素
注意下标是从0开始。
#include<iostream>
using namespace std;
#include <Eigen/Core>
// 求特征值,逆矩阵要用
#include<Eigen/Dense>
int main()
{
Eigen::Matrix<double, 2, 3> matrix_23;
// 给矩阵赋值它会自动变成2行3列的矩阵
matrix_23 << 1.3,2,3,4,5,6;
cout << matrix_23(0,0) << endl;
return 0;
}
4. 矩阵转置,各元素求和,对角线元素之和(迹),逆,行列式
#include<iostream>
using namespace std;
#include <Eigen/Core>
// 求特征值,逆矩阵要用
#include<Eigen/Dense>
int main()
{
Eigen::Matrix<double, 2, 2> matrix_22;
// 给矩阵赋值它会自动变成2行3列的矩阵
matrix_23 << 1.3,2,3,4;
cout << "转置
" <<matrix_22.transpose() << endl;
cout << "各元素之和
" <<matrix_22.sum() << endl;
cout << "对角线元素之和(迹)
" <<matrix_22.trace() << endl;
cout << "逆矩阵
" <<matrix_22.inverse() << endl;
cout << "行列式
" <<matrix_22.determinant() << endl;
return 0;
}
5. 随机生成特定形状的矩阵(各元素是随机数)
#include<iostream>
using namespace std;
#include <Eigen/Core>
// 求特征值,逆矩阵要用
#include<Eigen/Dense>
int main()
{
Eigen::Matrix<double, 2, 2> matrix_22;
matrix_22 = Eigen::MatrixXd::Random(2,2);
cout << matrix_22 << endl;
return 0;
}
6. QR分解
计算量有点大会卡一下。
#include<iostream>
using namespace std;
#include <Eigen/Core>
// 求特征值,逆矩阵要用
#include<Eigen/Dense>
int main()
{
// 假设我们要解这个方程 Ax=b
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> A,x,b;
A = Eigen::MatrixXd::Random(60,10);
b = Eigen::MatrixXd::Random(60,1);
x = A.colPivHouseholderQr().solve(b);
cout<< x<< endl;
return 0;
}