[Eigen中文文档] 将STL容器与Eigen一起使用

2023-05-16

文档总目录

本文目录

        • 摘要
        • 使用对齐分配器
        • std::vector 的情况
        • 另一种选择 - 为 Eigen 类型特殊化 std::vector

英文原文(Using STL Containers with Eigen)

摘要

同样,如果使用足够新的编译器(例如,GCC>=7、clang>=5、MSVC>=19.12)以 [c++17] 模式编译,那么编译器会自动处理所有事情,可以跳过本节。

否则,在固定大小的可向量化 Eigen 类型或具有此类成员的类上使用 STL 容器时,需要使用过度对齐的分配器。

也就是说,分配器能够分配具有 16、32 甚至 64 字节对齐的缓冲区。Eigen 确实提供了一个接口:aligned_allocator。

在 [c++11] 之前,如果想使用 std::vector 容器,还必须#include <Eigen/StdVector>

这些问题仅出现在固定大小的可向量化 Eigen 类型和具有此类 Eigen 对象作为成员的结构体中。对于其他 Eigen 类型,例如 Vector3fMatrixXd,在使用 STL 容器时无需特别注意。

使用对齐分配器

STL 容器有一个可选的模板参数,即分配器类型。在固定大小的可向量化 Eigen 类型上使用 STL 容器时,需要告诉容器使用在 16 字节对齐(或更多)位置分配内存的分配器。Eigen 提供了这样一个分配器:Eigen::aligned_allocator

例如:

std::map<int, Eigen::Vector4d>

他的对齐的分配器形式为:

std::map<int, Eigen::Vector4d, std::less<int>, 
         Eigen::aligned_allocator<std::pair<const int, Eigen::Vector4d>>>

请注意,第三个参数 std::less<int> 只是默认值,但必须包含它,因为要指定第四个参数,即分配器类型。

std::vector 的情况

本节仅适用于 c++98/03 用户。 [c++11](或以上)用户可以跳过这里。

c++98/03 中,因为标准中的一个 bug 使 std::vector 的情况更加复杂。为了解决这个问题,必须使用 Eigen::aligned_allocator#include <Eigen/StdVector>

示例如下:

#include<Eigen/StdVector>
/* ... */
std::vector<Eigen::Vector4f,Eigen::aligned_allocator<Eigen::Vector4f> >

std::vectorresize() 方法接受一个 value_type 参数(默认为 value_type())。因此,对于 std::vector<Eigen::Vector4d>,一些 Eigen::Vector4d 对象将按值传递,这会丢弃所有对齐修饰符,因此可以在未对齐的位置创建 Eigen::Vector4d。为了避免这种情况,唯一解决方案是特殊化 std::vector 以使其在 Eigen::Vector4d 上生效。

另一种选择 - 为 Eigen 类型特殊化 std::vector

作为上述推荐方法的替代方法,可以选择将 std::vector 特殊化为需要对齐的 Eigen 类型。优点是不需要使用 Eigen::aligned_allocator 声明 std::vector。缺点是需要在所有代码段之前定义特殊化,例如使用 std::vector<Vector2d>。否则,在不知道特殊化的情况下,编译器将使用默认的 std::allocator 编译该特定实例,并且程序很可能会崩溃。

示例如下:

include<Eigen/StdVector>
/* ... */
EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Matrix2d)
std::vector<Eigen::Vector2d>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Eigen中文文档] 将STL容器与Eigen一起使用 的相关文章

  • 结构体的对齐规则(结构体的计算)

    1 第一个成员在与结构体变量偏移量为0的地址处 2 其他成员变量要对齐到某个数字 xff08 对齐数 xff09 的整数倍的地址处 对齐数 61 编译器默认的一个对齐数 与 该成员大小的较小值 3 结构体总大小为最大对齐数 xff08 每个
  • hostapd 配置项解析

    hostapd 配置项解析 1 interface2 wps state3 hw mode4 channel5 beacon int6 max num sta 1 interface 一般默认interface 61 wlan0 注 xff
  • 滑动窗口算法总结

    算法目的 滑动窗口法 xff0c 也叫尺取法 xff08 可能也不一定相等 xff0c 大概就是这样 61 61 xff09 xff0c 可以用来解决一些查找满足一定条件的连续区间的性质 xff08 长度等 xff09 的问题 由于区间连续
  • linux软链接的创建、删除和更新

    大家都知道 xff0c 有的时候 xff0c 我们为了省下空间 xff0c 都会使用链接的方式来进行引用操作 同样的 xff0c 在系统级别也有 在Windows系列中 xff0c 我们称其为快捷方式 xff0c 在Linux中我们称其为链
  • 进程、线程、多进程、多线程的优缺点和区别

    进程 xff1a 是并发执行的程序在执行过程中分配和管理资源的基本单位 xff0c 是一个动态概念 xff0c 竞争计算机系统资源的基本单位 线程 xff1a 是进程的一个执行单元 xff0c 是进程内科调度实体 比进程更小的独立运行的基本
  • Postman 汉化(Postman中文版)

    1 首先从官网下载postMan安装包 postman官网下载地址 Download Postman Get Started for Free 2 下载postMan 汉化包 app zip postman汉化包 Releases hlmd
  • UDP的客户端和服务器端的实例(VC6.0实现)

    服务器端程序 xff1a UdpServer cpp Defines the entry point for the console application include 34 stdafx h 34 include lt stdio h
  • STM32中关于串口中断的调试(不断进入发送中断的原因)

    说来惭愧 xff0c 前日在调试stm32f10系列的单片机的时候 xff0c 想做一个关于串口发送的状态机 xff0c 每隔100毫秒发送一次命令 没有用DMA xff0c 就是想单纯的使用发送中断来数据 xff0c 结果在调试的时候一直
  • Psoc Creator 入门——空工程的建立

    最近在做psoc 4000芯片的开发 xff0c 现在简单的说说怎么利用psoc creator进行开发 首先 xff0c 安装psoc creator xff0c 我使用的版本是4 0 安装过程省略 xff0c 赛普拉斯官网有下载链接 x
  • mbedtls使用openssl生成的自签名证书进行TLS实验

    目录 1 使用openssl生成自签名证书2 VS2013编译mbedtls3 mbdtls默认对证书的要求4 mbdtls测试例子详解5 运行测试程序 1 使用openssl生成自签名证书 openssl是一个安全套接字层密码库 xff0
  • IIC的通信波形分析

    关于IIC xff0c 不解释它的历史了 xff0c 有兴趣自己去百度看看 xff0c 本文的图片是由周立功的LAB6021逻辑分析仪抓取的 xff0c 通信的波形是抓取的cypress的psoc 4000芯片得到的 最近项目需要用到触摸I
  • linux下的CSV文件操作

    先介绍一下什么是csv文件 xff0c 这是一种简单的文本文件 xff0c 也被称为逗号分隔值文件 主要是用于存储简单的数据 xff0c 下面在weindows下用UE简单生成一下文件 然后用excel打开 这就是一个简单的csv文件 xf
  • GNU makefile入门——刚开坑,没有干货

    一个完整的makefile文件包含5个部分的内容 xff1a 显示规则 xff0c 隐含规则 xff0c 变量和指示符 xff0c 注释 显示规则 xff1a 包括目标 xff1a 依赖规则 命令 隐含规则 xff1a make根据目标文件
  • Renesas CS+ for ca cx入门(一)

    这是一篇关于Renesas的CS 43 for ca xff08 以下简称CA xff09 的入门简介 xff0c 在网上关于这个IDE的使用方法比较少人讲述 xff0c 兴许使用的人比较少吧 另一个类似的IDE是CS 43 for cc
  • 单片机——按键扫描

    按键扫描 xff0c 我想应该是比较简单的单片机应用了 xff0c 但是有时候看起来简单的东西反而不好写 本文拿大部分人觉得简单的按键扫描聊聊我工作至今对于软件结构的理解 嗯 xff0c 对的 xff0c 是结构 xff0c 不是架构 xf
  • keil的错误: Error: Encountered an improper argument 的解决方法

    将附件中的文件下载然后放到keil一下的安装目录中即可C Keil v5 UV4 xff0c 选择替换即可 文件链接 xff1a http download csdn net download ma57457 10118005 官方说的是支
  • 嵌入式软件没有层次感的原因

    因为软件是一个人写的 xff01 xff01 xff01
  • 博客网站转移

    我的博客会慢慢的转移到新的网站上 xff0c 新的地址为oopsrtos com xff0c 新博客会对arm 体系结果做更深入的探讨 xff0c 主要是关于实时操作系统内核开发的研究 最近在研究FPU xff0c 从内核层解释在操作系统中
  • keil工程中找不到头文件的可能原因

    今天用keil写一个串口调试程序 xff0c 编译工程时 xff0c 总是找不到type h头文件 xff0c 而该文件又是必须的 于是 xff0c 重新看设置 xff0c 头文件路径已经包含到工程里了 xff0c 头文件也已经添加到工程里
  • 在NAND FLASH上建立YAFFS2文件系统

    在NAND FLASH上建立YAFFS2文件系统 xff08 一 xff09 By on 2006 07 22 经过了半个多月的努力 xff0c 终于搞定nandflash的mtd驱动和上层的yaffs2文件系统 这半个多月来几乎每天都要和

随机推荐