[Eigen中文文档] 深入了解 Eigen - 类层次结构

news/2024/7/8 2:05:32

文档总目录

本文目录

        • 原则
        • Core 类
        • 基类
        • 继承图

英文原文(The class hierarchy)

本页面介绍了Eigen类层次结构中 Core 类的设计及其相互关系。一般用户可能不需要关注这些细节,但对于高级用户和Eigen开发人员可能会有用。

原则

Eigen的类层次结构的设计是为了避免虚函数的开销会严重影响性能。相反,Eigen使用奇怪递归模板模式(Curiously Recurring Template Pattern,CRTP)实现多态性。在这个模式中,基类(比如MatrixBase)本质上是一个模板类,派生类(比如Matrix)继承了基类,派生类本身作为模板参数(在这种情况下,MatrixMatrixBase<Matrix>继承)。这样,Eigen可以在编译时解析多态函数调用。

此外,该设计避免了多继承。其中一个原因是,根据我们的经验,一些编译器(如MSVC)无法执行空基类优化,而这对于我们的固定大小类型至关重要。

Core 类

如果你想编写接受或返回Eigen对象的函数,那么你需要了解以下类:

  • Matrix:是指密集的平面矩阵。如果m是一个矩阵,那么例如m+m不再是一个矩阵,它是一个“矩阵表达式”。
  • MatrixBase:指的是密集矩阵表达式。这意味着MatrixBase是可以进行加法、矩阵乘法、LU分解、QR分解等操作的。所有的矩阵表达式类,包括Matrix本身,都继承自MatrixBase
  • Array:指的是普通的密集数组。如果x是一个Array,那么例如x+x就不再是一个Array,而是一个"数组表达式"。
  • ArrayBase:指的是密集数组表达式。这意味着ArrayBase是可以相加、数组乘法以及执行各种数组操作的表达式。所有的数组表达式类,包括Array本身,在继承时都会继承ArrayBase
  • DenseBase:指的是密集(矩阵或数组)表达式。ArrayBaseMatrixBase都继承自DenseBaseDenseBase是所有方法的集合,这些方法适用于密集表达式,无论是矩阵还是数组表达式。例如,block(...)方法就属于DenseBase

基类

这些类是上述五个核心(Core)类的基类。它们更多是内部使用,对于使用Eigen库的用户来说不太常见。

  • PlainObjectBase:表示密集(矩阵或数组)的普通对象,即存储其自己的密集系数数组的对象。例如,resize()方法就在这里。PlainObjectBaseMatrixArray继承。但是,上面我们说Matrix继承了MatrixBaseArray继承了ArrayBase。那么这是否意味着多重继承?不是的,因为PlainObjectBase本身会根据我们是处于矩阵还是数组情形而继承MatrixBaseArrayBase。当我们说Matrix通过PlainObjectBase间接继承MatrixBase时,我们省略了这一点。Array也是同理。

  • DenseCoeffsBase:表示具有密集系数访问器的对象。它是DenseBase的一个基类。DenseCoeffsBase存在的原因是,可用系数访问器的集合取决于密集表达式是否具有直接访问内存的能力(DirectAccessBit标志)。例如,如果x是一个普通矩阵,则x具有直接访问,x.transpose()x.block(...)也具有直接访问,因为它们的系数可以直接从内存中读取,但是x+x没有直接内存访问,因为获取它的任何系数都需要计算(加法),不能直接从内存中读取。

  • EigenBase:表示任何可以计算为普通密集矩阵或数组的东西(即使这可能不是一个好主意)。EigenBase实际上是任何类似于矩阵或数组的东西的绝对基类。它是DenseCoeffsBase的一个基类,因此它位于我们所有密集类的层次结构之下,但它并不限于密集表达式。例如,EigenBase也被对角矩阵、稀疏矩阵等继承。

继承图

Matrix 的继承图如下所示:

EigenBase<Matrix>
  <-- DenseCoeffsBase<Matrix>    (direct access case)
    <-- DenseBase<Matrix>
      <-- MatrixBase<Matrix>
        <-- PlainObjectBase<Matrix>    (matrix case)
          <-- Matrix

Array 的继承图如下所示:

EigenBase<Array>
  <-- DenseCoeffsBase<Array>    (direct access case)
    <-- DenseBase<Array>
      <-- ArrayBase<Array>
        <-- PlainObjectBase<Array>    (array case)
          <-- Array

另一个矩阵表达式类的继承图如下,此处用SomeMatrixXpr表示:

EigenBase<SomeMatrixXpr>
  <-- DenseCoeffsBase<SomeMatrixXpr>    (direct access or no direct access case)
    <-- DenseBase<SomeMatrixXpr>
      <-- MatrixBase<SomeMatrixXpr>
        <-- SomeMatrixXpr

另一个数组表达式类的继承图如下,此处用SomeMatrixXpr表示:

EigenBase<SomeArrayXpr>
  <-- DenseCoeffsBase<SomeArrayXpr>    (direct access or no direct access case)
    <-- DenseBase<SomeArrayXpr>
      <-- ArrayBase<SomeArrayXpr>
        <-- SomeArrayXpr

最后,一个不是密集表达式的示例,例如对角矩阵。相应的继承图如下:

EigenBase<DiagonalMatrix>
  <-- DiagonalBase<DiagonalMatrix>
    <-- DiagonalMatrix

http://lihuaxi.xjx100.cn/news/1357732.html

相关文章

深入浅出学好信号完整性概述总结专题

&#x1f3e1;《总目录》   &#x1f3e1;《宝典目录》 1&#xff0c;概述 本专题对信号完整性的本质&#xff0c;重要性&#xff0c;解决的问题&#xff0c;及解决方法等进行总结&#xff0c;帮助读者更加深入的理解信号完整性&#xff0c;并建立解决信号完整性问题的方向。…

ubuntu 20.04上安装更新的nodejs

How To Install Node.js on Ubuntu 20.04 | DigitalOcean ubuntu20上默认用apt install 安装的nodejs版本是 v10.几 官方提供了对应的脚本&#xff0c; 下面的setup_19.x 如果你需要v18&#xff0c;就把19改成18. # node 安装较新的版本 curl -sL https://deb.nodesource.co…

Java源码规则引擎:jvs-rules数据扩展及函数配置说明

jvs-rules数据拓展节点 数据拓展是数据可视化加工过程中的重要工具&#xff0c;它核心的作用是对原有数据表进行加工扩展&#xff0c;实现功能如下图所示 函数配置操作过程 操作说明 1、拖动数据拓展字段&#xff0c;并将字段拓展与之前的历史节点连接起来&#xff0c;点击数…

Redis底层封装细节

日常我们程序员在使用redis做缓存的时候&#xff0c;很少会直接使用到RedisTemplate直接操作k-v键值对&#xff0c;而是通过对RedisTemplate原生代码的封装&#xff0c;来构建我们日常便于使用习惯的代码来操作数据&#xff0c;这里我分享一下日常基本的对RedisTemplate底层的封…

【C++】STL反向迭代器模拟实现,迭代器适配器,迭代器类型简单介绍

反向迭代器 前言正式开始基本演示模拟实现的大致思路基本框架前置、--*重载->重载list和vector适配反向迭代器迭代器的类型库中reverse和sort模板参数中的迭代器reversesort 前言 本篇主要讲反向迭代器的模拟实现。 能够加深各位对泛型的理解。 前面我那篇string介绍里面…

将maven库中没有的jar包导入本地库后编译还提示缺这个jar包

Maven本地仓库有对应的jar包但是报找不到 问题原因 第一&#xff0c;你本地仓库对应的包文件夹下有_remote.repositories这个文件&#xff1b; 第二&#xff0c;你的项目现在连接不到下载这个包的仓库&#xff1b; 以上两点就是本地明明有对应的jar包&#xff0c;但项目中还…

Anaconda安装和激活

一、Anaconda下载地址 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?CM&OD 说明&#xff1a;使用paddlepaddle需要先安装python环境&#xff0c;这里我们选择python集成环境Anaconda工具包 Anaconda是1个常用的python包管理程序安装完Anaconda后&#xff0c…

C语言程序设计——结构体、枚举、联合

一、结构体 1. 概念 结构体是一种自定义的数据类型&#xff0c;它是一些值的集合&#xff0c;这些值称为成员变量&#xff0c;结构体由多个数据成员组成&#xff0c;这些成员可以是不同类型的变量。 2. 结构体的声明 2.1 一般声明 struct student {char name[10];int age; …