zoukankan      html  css  js  c++  java
  • 一文梳理Ubuntu下Eigen矩阵运算库总结教程

    Eigen是一个高效率的c++矩阵运算库,tensorflow等一系列开源框架都是用它来进行高效率的代数运算。如果你还没安装Eigen,那么亲参考Ubuntu下如何安装与使用cmake编译Eigen

    0. 入门

    1. 定义一个矩阵变量并赋值

    注意Eigen中的矩阵要提前告诉程序各元素的数据类型(如果你不告诉它各元素是什么类型它默认是double类型)。比如你申明矩阵各个元素是int,然后你给矩阵某个元素赋值是1.3,它会变成1。

    #include<iostream>
    #include <Eigen/Core>
    // 求特征值,逆矩阵要用
    #include<Eigen/Dense>
    int main()
    {
        // 定义一个2×3的float矩阵
        // (注意每个元素都是float,有一个int就会报错)
        // Eigen中所有矩阵类型都市Matrix,
        // 它是一个模板类。模板的三个参数为<元素类型,行数,列数>
        Eigen::Matrix<int, 2, 3> matrix_23;
        // 给矩阵赋值它会自动变成2行3列的矩阵
        matrix_23 << 1.3,2,3,4,5,6;
        cout << matrix_23 <<endl;
    
        // 定义一个三维的向量(默认各元素是double类型)
        // 它等价于Eigen::Matrix<double,3,1> v1_3d;
        Eigen::Vector3d v1_3d;
        Eigen::Vector3d v2_3d;
    
        v1_3d << 1,2,3;
        v2_3d << 3,4,5;
        return 0;
    }
    

    注意Eigen预定义矩阵最大是50行50列。如果比这个还大或者不知道行数那就得用使用它的动态矩阵

    Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > matrix_dynamic;
    

    2. 矩阵乘法

    注意矩阵乘法两个矩阵各元素类型一定要一样不然会报错。比如有个矩阵各元素类型是int,另外一个是float那么会报错。

    #include<iostream>
    using namespace std;
    #include <Eigen/Core>
    // 求特征值,逆矩阵要用
    #include<Eigen/Dense>
    int main()
    {
        Eigen::Matrix<double, 2, 3> matrix_23;
        // 给矩阵赋值它会自动变成2行3列的矩阵
        matrix_23 << 1.3,2,3,4,5,6;
    
        // 定义一个三维的向量(默认各元素是double类型)
        // 它等价于Eigen::Matrix<double,3,1> v1_3d;
        Eigen::Vector3d v1_3d;
        v1_3d << 1,2,3;
        // 这个就是矩阵乘法
        cout << matrix_23*v1_3d << endl;
        return 0;
    }
    
    

    3. 根据下标访问矩阵的元素

    注意下标是从0开始。

    #include<iostream>
    using namespace std;
    #include <Eigen/Core>
    // 求特征值,逆矩阵要用
    #include<Eigen/Dense>
    int main()
    {
        Eigen::Matrix<double, 2, 3> matrix_23;
        // 给矩阵赋值它会自动变成2行3列的矩阵
        matrix_23 << 1.3,2,3,4,5,6;
        cout << matrix_23(0,0) << endl;
        return 0;
    }
    

    4. 矩阵转置,各元素求和,对角线元素之和(迹),逆,行列式

    #include<iostream>
    using namespace std;
    #include <Eigen/Core>
    // 求特征值,逆矩阵要用
    #include<Eigen/Dense>
    int main()
    {
        Eigen::Matrix<double, 2, 2> matrix_22;
        // 给矩阵赋值它会自动变成2行3列的矩阵
        matrix_23 << 1.3,2,3,4;
        cout << "转置
    " <<matrix_22.transpose() << endl;
        cout << "各元素之和
    " <<matrix_22.sum() << endl;
        cout << "对角线元素之和(迹)
    " <<matrix_22.trace() << endl;
        cout << "逆矩阵
    " <<matrix_22.inverse() << endl;
        cout << "行列式
    " <<matrix_22.determinant() << endl;
    
        return 0;
    }
    

    5. 随机生成特定形状的矩阵(各元素是随机数)

    #include<iostream>
    using namespace std;
    #include <Eigen/Core>
    // 求特征值,逆矩阵要用
    #include<Eigen/Dense>
    int main()
    {
        Eigen::Matrix<double, 2, 2> matrix_22;
        matrix_22 = Eigen::MatrixXd::Random(2,2);
        cout << matrix_22 << endl;
        return 0;
    }
    
    

    6. QR分解

    计算量有点大会卡一下。

    #include<iostream>
    using namespace std;
    #include <Eigen/Core>
    // 求特征值,逆矩阵要用
    #include<Eigen/Dense>
    int main()
    {
        // 假设我们要解这个方程 Ax=b
        Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> A,x,b;
        A = Eigen::MatrixXd::Random(60,10);
        b = Eigen::MatrixXd::Random(60,1);
        x = A.colPivHouseholderQr().solve(b);
        cout<< x<< endl;
        return 0;
    }
    
    
    知乎 https://www.zhihu.com/people/yuanmuou/activities
  • 相关阅读:
    Http常用请求
    大量数据导出到Excel(不使用微软Excel控件)---------------转自CSDN--rocket2010
    ASP.NET 在IIS上发布时,报错404.17 提示找不到系统文件
    PTA7-1 一元多项式的乘法与加法运算(Java实现)
    Java输入几行字符串
    看电视(贪心算法)
    出租车费(贪心算法)
    简化路径(栈实现)
    有效的括号
    链表反转
  • 原文地址:https://www.cnblogs.com/ailitao/p/11047268.html
Copyright © 2011-2022 走看看