eigen源码阅读笔记-1

Eigen是一个C++模板库,提供了许多用于线性代数、矩阵运算和数值计算的功能。它被设计用来高效地进行数学运算,并且具有良好的性能。

一些主要特点包括:

模板库: Eigen完全是一个基于模板的库,因此可以用于任何数值类型(如整数、浮点数、双精度数等),并且可以进行静态和动态大小的矩阵运算。

高性能: Eigen采用了一些优化技术,例如表达式模板、矢量化指令等,以提高运行速度和优化内存访问模式,从而实现高性能的线性代数计算。

丰富的功能: Eigen提供了许多常见的线性代数运算,如矩阵乘法、求逆、特征值分解、奇异值分解等,还包括一些其他的数学运算和工具。

轻量级和易用性: Eigen被设计为轻量级且易于使用,可以方便地集成到各种C++项目中,同时提供了清晰的API和文档。

Eigen被广泛应用于科学计算、机器学习、计算机图形学等领域,特别是在需要高效进行数学运算的应用程序中。

源码位置

eigen的源码托管于gitlab: https://gitlab.com/libeigen/eigen

github 镜像:
https://github.com/eigenteam/eigen-git-mirror

Eigen的特点:

  • 纯头文件,不需要编译成动态链接库,所有需要的文件都在Eigen/目录下, 比如安装后的eigen:在这里插入图片描述
    实际上就是将源码中的Eigen文件夹整个复制到了安装位置
  • 接口头文件没有后缀名,比如文件Eigen, 使用#include 形式进行头文件包含

项目组织结构

eigen 库的头文件引用关系如下所示:
在使用时,可以直接include , 这将引用所有内容
也可以只include需要的部分
eigen源码阅读笔记-1_第1张图片

类继承关系

可以参考: 通过源码使用doxygen生成的doc: TopicClassHierarchy.html
在这里插入图片描述
注:

  • EigenBase是所有数据格式的基类
  • PlainObjectBase直接继承自nternal::dense_xpr_base::type,dense_xpr_base::type通过传入的Derived类不同而表示MatrixBase或者ArrayBase
  • dense_xpr_base表示 dense expression Base, 即表示稠密表达式
  • Eigen中只有Matrix和Array两种基础数据格式,其他数据类型都是通过这两种定义的
  • 方法论:通过vscode的正则表达式搜索可以找出继承关系,如下所示:
    eigen源码阅读笔记-1_第2张图片

数据类型

  1. Matrix:表示数值矩阵,可以是动态大小或静态大小的矩阵,提供线性代数级操作
  2. Array: 与矩阵类似,但元素可以是任意类型,而不仅限于数值类型,提供元素级操作
    matrix和array类型的变量可以相互转换

无论是Matrix还是Array, 都只定义了两个维度,
○ Array里面的元素类型可以是Array,就可以实现多个维度了
○ 但是Matrix得元素只能是数值类型,因此Matrix最多就是两个维度

读代码顺序

按照类继承关系,从基类到子类,从Matrix类系列开始
即:
EigenBase -> DenseCoeffsBase -> DenseBase -> MatrixBase -> PlainObjectBase -> Matrix

从源码中可以学到什么

  • 模版元编程的实例
    eigen中使用了大量的模版元编程技术,值得学习
  • CRTP编程方法
    eigen中大量使用了CRTP的设计模式,可以在自己的项目中参考
  • lazy Evaluation的方法
    eigen速度快的一个原因,就是使用了延迟计算的方法,可以通过eigen的源码来学习其实现方法
  • 指令集并行优化
    eigen中使用了大量的指令集并行的优化方法,可以作为工作中写代码的参考
  • 学习纯头文件项目的组织结构
    eigen是一个纯头文件的项目,如果实际工作中需要编写这样的项目,也可以参考
  • doxygen的各种语法的使用实例
    eigen使用doxygen来生成自己的使用文档,在eigen发版时的CI流程执行时,自动生成并上传至其官方服务器上

你可能感兴趣的:(eigen,笔记,c++,自动驾驶,深度学习)