Eigen 是一个很有用的矩阵运算库。
安装过程:添加链接描述
CmakeLists:
cmake_minimum_required(VERSION 2.8)
project( useEigen )
set (CMAke_BUILD_TYPE "Release")
set( CMAKE_CXX_FLAGS "-O3" )
find_package(Eigen3 REQUIRED)
include_directories (${EIGEN3_INCLUDE_DIR} )
add_executable (eigenMatrix eigenMatrix.cpp)
- 定义不同的Eigen 类型:
`//列举不同的Eigen类型
Eigen::Matrix<float, 2, 3>matrix_23;
Eigen::Vector3d v_3d;
Eigen::Matrix<float,3,1> vd_3d;
Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero();
Eigen::Matrix<double, Eigen::Dynamic,Eigen::Dynamic> matrix_dynamic;
Eigen::MatrixXd matrix_x;`
- 单独赋值并访问:
matrix_23 << 1, 2, 3, 4, 5, 6;
cout << matrix_23 << endl;
for (int i = 0; i < 2; i++)
{
for(int j = 0; j <3; j++)
{
cout << matrix_23(i,j) << "\t";
}
cout << endl;
}
3.由于Eigen不能向C++等语言一样可以自动的进行类型转换,所以当有两种不同类型的矩阵相乘时需要用Eigen进行类型转换:
matrix_23.cast<double>()
4.Eigen 产生随机矩阵:
matrix_33 = Eigen::Matrix3d::Random();
- 常用的矩阵运算:
cout << matrix_33.transpose() << endl; //转置
cout << matrix_33.sum() << endl; //矩阵求和
cout << matrix_33.trace() << endl; //求迹
cout << 10 * matrix_33 << endl;
cout << matrix_33.inverse() << endl;
cout << matrix_33.determinant() << endl; //求行列式
- 求特征值:
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver (matrix_33.transpose()*matrix_33);
cout << "Eigen values = \n" << eigen_solver.eigenvalues() << endl;
cout << "Eigen vector = \n" << eigen_solver.eigenvectors() << endl;
- 解方程 例如 a*x = b;
//解方程
Eigen::Matrix<double, MATRIX_SIZE, MATRIX_SIZE> matrix_NN;
matrix_NN = Eigen::MatrixXd::Random(MATRIX_SIZE, MATRIX_SIZE);
Eigen::Matrix <double, MATRIX_SIZE, 1> v_Nd;
clock_t time_set = clock();
Eigen::Matrix<double,MATRIX_SIZE,1> x = matrix_NN.inverse() * v_Nd;
cout << "time use in normal inverse is " << 1000*(clock() - time_set)/(double) CLOCKS_PER_SEC << "ms" << endl;
//通用的矩阵分解 (QR分解 )
time_set = clock();
x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
cout << "time use in Qr decomposition is " << 1000*(clock() - time_set) /(double)CLOCKS_PER_SEC << "ms" << endl;