0.前言 与 Eigen库的使用整理

2023-11-15

[C++ 基于Eigen库实现CRN前向推理]

前言:背景 与 Eigen库的使用整理

1. 前言

最近要用C++ 实现一下CRN网络的前向推理过程,了解了一下相关的库,决定使用Eigen提供的Tensor作为数据结构,并使用一些Eigen的常规的库函数。(纯C++实现嵌套的循环太多层了,容易写迷糊了,先降低难度写一波)


2. C++ Eigen库的使用

Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C++库,它里面包含了很多算法。它的License是MPL2。它支持多平台。

Eigen采用源码的方式提供给用户使用,在使用时只需要包含Eigen的头文件即可进行使用。之所以采用这种方式,是因为Eigen采用模板方式实现,由于模板函数不支持分离编译,所以只能提供源码而不是动态库的方式供用户使用。

在找资料的时候发现了Eigen 矩阵操作与Matlab的对应关系,虽然在这个项目里没有用到,但后面可能会用到,先码住,链接在这

2.1 下载与导入
  • 第一步

Eigen下载地址官网在这,直接去官网下载解压包,解压到本地。
在这里插入图片描述
我这路径为E:\eigen-3.4.0,版本为3.4.0。

  • 第二步
    把Eigen-3.4.0目录中的需要用到的包复制到对应C++项目的目录下,本文就用到Eigen核心和unsupported中的Tensor。
    在这里插入图片描述
  • 第三步
    在CmakeList中添加lib,红框圈起来的部分就是Eigen的引用啦。至于上面的一大串是MATLAB库的导入,不用管就好了。
    在这里插入图片描述
  • 第四步
    到这里就差不多能用啦,写个初始化测试一下:
    int main() {
         
    	Eigen::Vector<double, 3> point(2, 1, 1);
        cout << point << endl;
        return 0;
    }	
    >>>>>
    2
    1
    1
    
    如果还是不行,可以尝试重启一下编译器,或者File->Reload CMake Project

2.2 Tensor的初始化

这里只讲Tensor的用法,Matrix 和Vector的教程网上很多。
Tensor数据类型不在Eigen/Core 和Eigen/Dense中,而是需要额外引用unsupported。

#include <unsupported/Eigen/CXX11/Tensor>

简单声明:Tensor声明格式如Eigen::Tensor<data_type,n_dim>,data_type是数据类型,n_dim是多维矩阵的维度。这里声明了一个2维矩阵,但是没有定义具体的大小,在输出时为空。

	Eigen::Tensor<double, 2> a;
	std::cout << a << std::endl;
	(blank)

在看指定具体大小的情况↓,可以看到为矩阵随机分配了初始值,矩阵只有在指定大小(即为其分配空间时才会产生内容)。通过resize方式,也可以进行初始化

    Eigen::Tensor<float, 2> var(2, 3);
    cout << var << endl;
    -1.83108e+23 -1.82998e+23            0
 	7.00649e-43  7.00649e-43            0

    Eigen::Tensor<float, 2> var;
    var.resize(2, 3);
    cout << var << endl;
    -2.6161e+31 -2.61461e+31            0
 	5.73131e-43  5.73131e-43            0

几种初始化函数
常数初始化

	var.setConstant(12.3f);
	cout << "Constant: " << endl << var << endl << endl;
	=>
	Constant:
	12.3 12.3 12.3
	12.3 12.3 12.3

置零初始化

	Eigen::Tensor<float, 2> var(2, 3);
    var.setZero();
    cout << "Constant: " << endl << var << endl << endl;
    =>
    Constant:
	0 0 0
	0 0 0

赋值初始化

	Eigen::Tensor<float, 2> var(2, 3);
    var.setValues({
   {
   0.0f, 1.0f, 2.0f},
                   {
   3.0f, 4.0f, 5.0f}});
    cout << "Constant: " << endl << var << endl << endl;
    =>
    Constant:
	0 1 2
	3 4 5

随机初始化

    Eigen::Tensor<float, 2> var(2, 3);
    var.setRandom();
    cout << "Constant: " << endl << var << endl << endl;
    Constant:
	0.896227 0.872269 0.605188
	0.290171  0.24641 0.251816

2.3 Tensor常用库函数
  • 重塑-reshape
    可以看到Eigen的Tensor是Col-Major的,所以存储顺序为0.896277,0.290171,0.872269…,重塑完按照(3,2)的形状分配。这里与Pytorch的矩阵reshape结果是不一致的
    Eigen::Tensor<float, 2> var(2, 3);
    var.setRandom();
    cout << "Constant: " << endl << var << endl << endl;
    Eigen::array<int, 2> new_shape{
   3, 2};
    auto vat_T = var.reshape(new_shape);
    cout << "Constant: " << endl << vat_T << endl << endl;
    Constant:
	0.896227 0.872269 0.605188
	0.290171  0.24641 0.251816
	
	Constant:
	0.896227  0.24641
	0.290171 0.605188
	0.872269 0.251816
	
	Pytorch.reshpe:
	0.896227 0.872269
	0.605188 0.290171
	0.24641 0.251816
  • 填充-Padding
    采用auto或者声明变量的形式保存pad函数的返回值都可以,不同的是auto类型保存的是PadOp,是一个操作,后续怎么操作也不清楚,希望有知道的大佬指点一二。用Tensor变量保存的话就是赋值存储了,后续正常按Tensor操作就可以。
	auto d0 = std::make_pair(1, 2);
	auto d1 = std::make_pair(2, 1);
	// auto dims = std::experimental::make_array(d0, d1); // 便利的写法
	Eigen::array<std::pair<int, int>, 2> dims{
   d0, d1};
	auto padded = var.pad(dims, -1);
	// Eigen::Tensor<float,2> padded;
	// padded = var.pad(dims,-1);
	std::cout << padded << std::endl;
	=>
	Constant:
	0.896227 0.872269 0.605188
	0.290171  0.24641 0.251816

      -1       -1       -1       -1       -1       -1
      -1       -1 0.896227 0.872269 0.605188       -1
      -1       -1 0.290171  0.24641 0.251816       -1
      -1       -1       -1       -1       -1       -1
      
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

0.前言 与 Eigen库的使用整理 的相关文章

  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46

随机推荐

  • android studio中的CMakeLists.txt,就是如此简单

    android studio中的CMakeLists txt 就是如此简单 user Linvest 目录 1 cmake minimum required VERSION 3 4 1 2 add library native lib SH
  • RabbitMQ简介与安装

    技术对比 MQ 中文是消息队列 MessageQueue 字面来看就是存放消息的队列 也就是事件驱动架构中的Broker 比较常见的MQ实现 ActiveMQ RabbitMQ RocketMQ Kafka 几种常见MQ的对比 Rabbit
  • Android的ADB工具使用

    在SDK的Tools文件夹下包含着Android模拟器操作的重要命令ADB ADB的全称为Android Debug Bridge 就是调试桥的作用 借助这个工具 我们可以管理设备或手机模拟器的状态 还可以进行以下的操作 1 快速更新设备或
  • react-antd中表格的使用(数据的请求,带删除功能的表格)

    前言 最近在学习react antd框架 表格这一块在项目中的使用频率很高 最近在学习这一块的内容 所以记录一下 基础表格请求数据 一般对于表格中的数据我们会进行请求 将请求到的数据存入表格中展示出来 当我们请求较少时可以这样写 const
  • AssetDatabase的方法

    静态函数 描述 AddObjectToAsset 添加对象到资产 AllowAutoRefresh 递减一个内部计数器 Unity使用它来决定是否允许自动的资产数据库刷新行为 AssetPathToGUID 获得资产的GUID ClearL
  • Unity 3D 资源下载

    Unity 3D 资源下载 你也可以在 Unity 3D 中执行 Window Asset Store 菜单命令直接访问 Unity 资源商店 Asset Store Unity 资源商店简介 Unity 资源商店https www ass
  • 为curl 、git、go语言、wget、repo设置代理,解决ubuntu 18.04编译chromium os问题

    为CURL设置proxy 设置代理的方式搜索了一下挺多的 我测试了这两种方式 这两种方式在ubuntu 18 04上可以运行 有两种方法 第一通过声明环境变量 export http proxy socks5h 127 0 0 1 1080
  • a 标签 onclick ( not a function)

    文章目录 说明 点击 download 点击 download1 说明 如图 download 在 body 下方声明 点击 download 则报错 download is not a function 点击 download1 则可以正
  • 【LeetCode刷题】

    菜鸡的LeetCode打怪记录 tips 本文涉及的一切内容仅本人学习使用 如不慎发生侵权行为 请滴滴我删除 谢谢 文章目录 菜鸡的LeetCode打怪记录 题目1480 Running Sum of 1d Array 思路 代码 评分结果
  • 合法ip算法实现——输入字符串,输出所有合法的ip

    输入为一串0 9之间的数字字符 不改变字符串中字符的前后顺序 输出所有合法的ip地址 IPV4下用一个32位无符号整数来表示一个ip地址 一般用点分方式来显示 点将ip地址分成4个部分 如 10 137 17 1 所以要输出所有合法ip 1
  • 2020暑假实习-百度前端一面&二面&三面

    2020暑假实习 百度前端一面 二面 三面 一面 算法题 JS实现二分搜索 随机打乱数组 HTML cookie localStorage sessionStorage区别 标签页之间的通信 cookie setInterval local
  • 合并升序链表系列(Java)

    LeetCode原题链接 21 合并两个有序链表 力扣 LeetCode 23 合并K个升序链表 力扣 LeetCode 目录 合并两个有序链表 题目表述 解法一 解法二 合并K个升序链表 题目描述 解法一 解法二 合并两个有序链表 题目表
  • 网络字节序与地址变换

    文章目录 1 主机字节序与网络字节序 2 字节序转换 Endian Conversions 1 主机字节序与网络字节序 CPU 向内存保存数据的方式有 2 2 2 种 这意味着 CPU 解析数据的方式也分为 2 2 2 种
  • unity3D-learnin:Priests and Devils

    阅读以下游戏脚本 Priests and Devils Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross t
  • datagrip 查询结果不能修改

    正常情况下 查询出来的结果集都能直接修改 工具栏会出现 符号 且修改后会出现要提交的提示 向上的绿色箭头 且主键字段会有一把钥匙的标识 如图 凡事总有意外 今天发现库中的A表查询结果不能修改 但B表又是可以修改的 更奇怪的是直接双击A表 打
  • RTL8762DK PWM(七)

    概述 本示例 只要介绍 如何使用PWM 又离成功进了一步 一 环境 1 硬件 RTL8762DK 128M Bits Falsh 2 软件 keil IDE 二 PWM的使用 1 创建examples ble pwm工程 基于 exampl
  • 【狂神】MySQL - Delete 和 Truncate 的区别

    1 DELETE 命令 语法 delete from 表名 where 条件 删除数据 避免这样写 会全部删除 DELETE FROM student 删除指定数据 DELETE FROM student WHERE id 1 2 TRUN
  • react-属性默认值与类型验证

    属性默认值 react提供了属性默认值的设置方法 defaultProps App js import React Component from react import ClassDefault from components Class
  • matlab变电站仿真,基于Matlab Simulink的110kV变电系统建模及故障仿真分析

    龙源期刊网 http www doczj com doc 3c7690b958fb770bf78a55d0 html 基于Matlab Simulink的110kV变电系统建模及故障仿真分析 作者 杨涛 来源 建筑工程技术与设计 2014年
  • 0.前言 与 Eigen库的使用整理

    C 基于Eigen库实现CRN前向推理 前言 背景 与 Eigen库的使用整理 前言 Eigen库使用记录 第一部分 WavFile class 实现读取wav pcm 实现STFT 第二部分 Conv2d实现 第三部分 Transpose