1、矩阵、向量表示
Eigen通过tyepdef定义了许多内置类型,不过底层仍然是Eigen::Matrix,如下所示:
Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero(): //初始化为0 ,Matrix3d实质上是Eigen::Matrix<double, 3, 3>
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix_dynamic; //如果不确定矩阵大小,可以使用动态大小的矩阵
Eigen::MatrixXd matrix_xd; //与上类似,表示任意大小的元素类型为double的矩阵变量
Eigen::MatrixXf matrix_xf; // float类型数据
Eigen::Vector3d v_3d; //Vector3d实质上是Eigen::Matrix<double, 3, 1>
2、常用矩阵
MatrixXf::Zero(3,4); // 将矩阵3行4列初始化为0
MatrixXf::Ones(3,3); // 将矩阵3行3列初始化为1
Vector3f::Ones(); // 将3行的纵向量初始化为1
MatrixXi::Identity(3,3); //单位阵
Matrix3d::Random(); //随机矩阵
3、矩阵运算
matrix_33.transpose() //转置
matrix_33.sum() //各元素和
matrix_33.trace() //迹
matrix_33 * 10 //数乘
matrix_33.inverse() //逆
matrix_33.determinant() //行列式
求特征值及特征向量
实对称矩阵可以保证对角化成功
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver(matrix_33.transpose()*matrix_33);
特征值 eigen_solver.eigenvalues()
特征向量 eigen_solver.eigenvectors()
求解
通常用矩阵分解来求,例如QR分解,速度会快很多
time_stt = clock(); // 获取现在时间
x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
1000 * (clock() - time_stt) / (double)CLOCKS_PER_SEC //单位ms