#include <iostream>
#include <ctime>
using namespace std;
#include<Eigen/Core>
#include<Eigen/Dense>
#define MATRIX_SIZE 50
int main(int argc, char **argv) {
//矩阵定义
Eigen::Matrix<float,2,3> matrix_23;
Eigen::Vector3d v_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)<<endl;
v_3d<<3,2,1;
Eigen::Matrix<double,2,1> result=matrix_23.cast<double>()*v_3d; //不同数据类型矩阵不能直接相乘,必须显式转换
cout<<result<<endl;
matrix_33=Eigen::Matrix3d::Random();
cout<<matrix_33<<endl;
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);
cout<<"Eigen values= "<<eigen_solver.eigenvalues()<<endl;
cout<<"Eigen vectors= "<<eigen_solver.eigenvectors()<<endl;
//解方程
//我们求解matrix_NN*x=v_Nd这个方程
//N的大小在前边的宏里定义,矩阵由随机数生成
//直接求逆自然是最直接的,但是求逆运算量太大
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;
v_Nd=Eigen::MatrixXd::Random(MATRIX_SIZE,1);
clock_t time_stt=clock();
//直接求逆
Eigen::Matrix<double,MATRIX_SIZE,1> x=matrix_NN.inverse()*v_Nd;
cout<<"time use in normal invers is "<<1000*(clock()-time_stt)/(double)CLOCKS_PER_SEC<<"ms"<<endl;
//通常用矩阵分解来求,例如QR分解,速度会快很多
time_stt=clock();
x=matrix_NN.colPivHouseholderQr().solve(v_Nd);
cout<<"time use in Qr compsition is "<<1000*(clock()-time_stt)/(double)CLOCKS_PER_SEC<<"ms"<<endl;
return 0;
}
Eigen基础
最新推荐文章于 2023-10-25 22:23:22 发布