Eigen是一个C++开源线性代数库,提供了快速的有关矩阵的线性代数计算
我用的编辑器是kdevelop,使用前需要先把库进行下载与导入 下载:sudo apt-get install libeigen3-dev 导入时的路径选择:/usr/include/eigen3/(在language support处导入),之后在命令行输入:sudo ln -sf eigen3/Eigen Eigen 和sudo ln -sf eigen3/unsupported unsupported,这两个指令都是用于创建链接
Eigen指令: #include <Eigen/Core> Eigen核心部分 #include <Eigen/Dense> 稠密矩阵的代数运算(例如逆、特征值等) 矩阵生成: Matrix<float,2,3> matrix_23; 生成一个名为 matrix_23,数据类型为float,2行3列的矩阵 Vector3d v_3d;与Matrix<float,3,1> v_3d; 都是生成一个名为v_3d的, 三行一列的矩阵(三维向量) Matrix3d matrix_33 = Matrix3d::Zero(); 生成一个名为 Matrix_33,数据类型为double,3行3列的矩阵,并且将矩阵初始化为0 Matrix<double, Dynamic, Dynamic> matrix_dynameic;或MatrixXd matrix_x; 生成一个行和列不确定的动态矩阵
矩阵操作: matrix_23 <<1,2,3,4,5,6; 一行一行写入 matrix_33 = Matrix3d :: Random(); 让3x3的double型矩阵的值为随机值 cout<<“matrix 2x3 from 1 to 6:\n”<<matrix_23<<endl; 输出整个矩阵 cout<<“print matrix 2x3:”<<endl; for (int i=0;i<2;i++){ for (int j=0;j<3;j++) cout<<matrix_23(i,j)<<"\t"; cout<<endl; } 一个个输出 v_3d<<1,2,3; 写入列向量 cout<<v_3d[0]<<endl; 按照数组的方法读取列向量的值 Matrix<double,2,1> result = matrix_23.cast() * v_3d; 这里要注意,数据类型必须相同 cout<<result<<endl; cout<<matrix_23.transpose()<<endl; 转置 cout<<“sum”<<matrix_23.sum()<<endl; 求和 cout<<“trace”<<matrix_23.trace()<<endl; 求迹 cout<<“times 10:”<<matrix_23*10<<endl; 数乘 cout<<“inverse”<<matrix_33.inverse()<<endl; 求逆 cout<<“det”<<matrix_33.determinant()<<endl; 求行列式
SelfAdjointEigenSolver<Matrix3d> eigen_solver(matrix_33.transpose() * matrix_33); 这一步是把矩阵转换成一个和它很相似的矩阵,用于更快的求解出特征值
cout<<"eigen values=\n"<<eigen_solver.eigenvalues()<<endl; 特征值
cout<<"eigen vectors=\n"<<eigen_solver.eigenvectors()<<endl; 归一化后的特征向量(列向量)
Matrix<double,50,50> matrix_NN=MatrixXd::Random(50,50); matrix_NN=matrix_NN*matrix_NN.transpose(); Matrix<double,50,1> v_Nd=MatrixXd::Random(50,1); Matrix<double,50,1> x=matrix_NN.inverse() * v_Nd; cout <<“x=”<<x.transpose()<<endl; 直接用求逆的方法来解方程,速度慢
x=matrix_NN.colPivHouseholderQr().solve(v_Nd);
cout<<"x="<<x.transpose()<<endl; 用QR分解的方法求解,速度快
x=matrix_NN.ldlt().solve(v_Nd);
cout<<"x="<<x.transpose()<<endl; 如果是正定矩阵,还可以用cholesky分解来求解
|