Table of Contents

Eigen

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;
}

Odt笔记(20221007)