【死磕slam14】slambook2第三讲 详解eigenMatrix.cpp
eigenMatrix.cpp
#include
using namespace std;#include //头文件有关时间的
#include
#include
using namespace Eigen;#define MATRIX_SIZE 50int main(int argc,char**argv)
{Matrix<float,2,3> matrix_23;Vector3d v_3d;//这里是一个别名 是3 1 的double向量Matrix<float,3,1> vd_3d;Matrix3d matrix_33 = Matrix3d::Zero();//初始化为0 matrix3d 其实就是3 3 的double矩阵Matrix<double,Dynamic,Dynamic> matrix_dynamic; //动态大小的矩阵MatrixXd matrix_x;//动态矩阵简单形式matrix_23 <<1,2,3,4,5,6;//floatcout<<"matrix 23 from 1 to6 : \n"<<matrix_23<<endl;//换行cout<<"print matrix 23:"<<endl;for(int i=0;i<2;i++){for(int j=0;j<3;j++) cout<<matrix_23(i,j)<<"\t";//美术出一个空4个字符,i=0结束后换行cout<<endl;} v_3d<<3,2,1;//doublevd_3d <<4,5,6;//floatMatrix<double,2,1> result= matrix_23.cast<double>() * v_3d; //将23 映射到double上cout << "[1,2,3;4,5,6]*[3,2,1]=" << result.transpose() << endl;//转置函数Matrix<float,2,1> result2=matrix_23 * vd_3d;cout << "[1,2,3;4,5,6]*[4,5,6]:=" << result2.transpose() << endl;matrix_33=Matrix3d::Random();//随机数的33 double矩阵cout <<"random Matrix: \n"<<matrix_33<<endl;//输出这个随机数矩阵cout<<"transpose: \n" <<matrix_33.transpose()<<endl; //转置cout<<"sum:"<<matrix_33.sum()<<endl;//各个元素和cout<<"trace:"<<matrix_33.trace()<<endl;//求迹cout<<"times 10: \n"<<10*matrix_33<<endl; //数乘cout<<"inverse: \n"<<matrix_33.inverse()<<endl; //逆cout<<"det:"<<matrix_33.determinant()<<endl;//行列式//实对称矩阵可以保证对角化成功 //特征值SelfAdjointEigenSolver<Matrix3d> eigen_solver(matrix_33.transpose()*matrix_33);//新定义了一个eigen_solver的对象,传入基本矩阵aT *acout<<"eigen values =\n"<<eigen_solver.eigenvalues()<<endl; //特征值cout<<"eigen vectors =\n"<<eigen_solver.eigenvectors()<<endl; //特征向量// 解方程// 我们求解 matrix_NN * x = v_Nd 这个方程// N的大小在前边的宏里定义,它由随机数生成// 直接求逆自然是最直接的,但是求逆运算量大Matrix<double,MATRIX_SIZE,MATRIX_SIZE> matrix_NN= MatrixXd::Random(MATRIX_SIZE,MATRIX_SIZE);//动态矩阵简单形式MatrixXd//EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X) //定义新的对象 matrix_NN,它是一个行列为MATRIX_SIZE的矩阵matrix_NN =matrix_NN*matrix_NN.transpose(); //保持半正定 //令A为 n 阶对称矩阵,若对任意n 维向量 x≠ 0都有 f(x)>0(≥0),则称A正定(半正定)矩阵;反之,令A为n 阶对称矩阵,若对任意 n 维向量 x≠0 ,都有 f(x)<0(≤ 0), 则称A负定(半负定)矩阵。Matrix<double,MATRIX_SIZE,1> v_Nd=MatrixXd::Random(MATRIX_SIZE,1);//新建一个matrix_size 1 的向量clock_t time_stt =clock();//计时 和ctime函数有关系// //1 直接求逆//Matrix x=matrix_NN.inverse() *v_Nd; // cout<<"time of normal inverse is"<<1000*(clock()-time_stt)/(double)CLOCKS_PER_SEC<<"ms"<// cout<<"x="<//使用QR分解来求// time_stt = clock();// Matrix x=matrix_NN.colPivHouseholderQr().solve(v_Nd); // cout<<"time of decomposition is"<<1000 *(clock()-time_stt)/(double)CLOCKS_PER_SEC<<"ms"<// cout<<"x="<// return 0;//对于正定矩阵可以使用cholesky分解来求解方程time_stt=clock();Matrix<double ,MATRIX_SIZE,1> x= matrix_NN.ldlt().solve(v_Nd);cout<<"time of ldlt decompositon is "<<1000*(clock()-time_stt)/(double)CLOCKS_PER_SEC<<"ms"<<endl;cout<<"x="<<x.transpose()<<endl;return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(useEigen)set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS "-O3")#CMAKE_CXX_FLAGS:g++编译选项
#CMAKE_CXX_FLAGS_RELEASE:编译Release版本的时候采用的编译选项,默认包-O3选项,该选项表示优化等级;include_directories("/usr/include/eigen3")
add_executable(eigenMatrix src/eigenMatrix.cpp)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
