Eigen是特征值的意思,这是一个数学库
#include<algorithm> #include<iostream> #include<Eigen/Eigen> //Eigen只需要包含头文件即可使用其接口,无需预先编译 //矩阵操作 void CreateMatrix() { //X自然指的就是矩阵的形状(可以自由指定),d说明矩阵的数据类型是double using namespace Eigen; //创建普通的未初始化的矩阵以及矩阵元素的访问方式 //在运行的时候确定矩阵的大小 MatrixXd m(2,2); //注意是从0开始的 m(0,0)=1; m(1,0)=2; m(0,1)=3; m(1,1)=4; std::cout<<m<<std::endl; //随机矩阵,随机的范围是(-1,1) MatrixXd random_m=MatrixXd::Random(3,3); std::cout<<random_m<<std::endl; //常量矩阵,矩阵中的每一个元素都是同一个值 MatrixXd constant_m=MatrixXd::Constant(3,3,3.14); std::cout<<constant_m<<std::endl; //在编译的时候确定形状的方式 //固定大小的形式编译更快,在编译阶段就能检查到某些错误 //不定大小的形式更灵活,支持更大的shape Matrix3d m3; m3<<1,2,3,4,5,6,7,8,9; std::cout<<m3<<std::endl; } //向量操作 void CreateVector() { //创建一个普通的未初始化的向量 using namespace Eigen; //设定向量的大小,在运行的时候确定,默认都是列向量 VectorXd v(3); v<<1,2,3; std::cout<<v<<std::endl; //声明行向量使用RowVectorXd //在编译的时候确定形状的方式 Vector3d v3(4,5,6); //访问某一个元素 v3(0) =1; v3[0] =2; v3.x()=3; std::cout<<v3<<std::endl; } //执行运算 void ProcessCalc() { using namespace Eigen; VectorXd x(3); x<<1,2,3; RowVectorXd y(3); y<<1,2,3; //向量相乘 std::cout<<x*y<<std::endl; //依次相乘 std::cout<<x.cwiseProduct(y); //行向量和列向量也可以算内积 std::cout<<x.dot(y)<<std::endl; //转置,矩阵的形状 std::cout<<y.size()<<std::endl; std::cout<<y.rows()<<"*"<<y.cols()<<std::endl; std::cout<<y.transpose().rows()<<"*"<<y.transpose().cols()<<std::endl; //转置不能这样做 x=x.transpose() //in place操作应该这样 x.transposeInPlace() //Vector不允许使用transposeInPlace? //Matrix才能使用in place的转置? MatrixXd m(3,4); m.transposeInPlace(); //cross不接受动态大小的Matrix //声明不同类型的Matrix的时候,不要用原来的变量了 //虽然都是Matrix的模板,但是好像不兼容的样子 //MatrixXd之间可以兼容,和Fixed的就不兼容的样子 //行向量和列向量之间也是可以cross的 auto _x=Vector3d(1,2,3); auto _y=RowVector3d(4,5,6); auto res=_x.cross(_y); std::cout<<res<<std::endl; } void MatrixFunction() { using namespace Eigen; MatrixXd m(2,2); m<<1,2,3,4; using namespace std; cout<<m.sum()<<endl;//求和 cout<<m.mean()<<endl;//求均值 cout<<m.prod()<<endl;//求积 cout<<m.minCoeff()<<endl;//最小(系数) cout<<m.maxCoeff()<<endl;//最大 cout<<m.trace()<<endl;//迹 MatrixXd n=MatrixXd::Random(2,3); //resize 不是 reshape n.resize(4,3); //adjoint 伴随 //eigen 特征 MatrixXd v=MatrixXd::Constant(5,5,3.14); MatrixXd w=MatrixXd::Constant(4,4,2.7); std::cout<<v<<std::endl; //MatrixXd之间赋值是可以的(虽然size不同,但是类型相同) //MatrixXd和Matrix3d这种赋值就不行了 v=w; std::cout<<v<<std::endl; } int main() { CreateMatrix(); CreateVector(); ProcessCalc(); MatrixFunction(); return 0; }