[Eigen中文文档] Array类与元素操作
文档总目录
本文目录
- 什么是Array类?
- Array类型
- 访问Array中的值
- 加法与减法
- Array乘法
- 其他按元素操作的运算
- array和matrix表达式之间的转换
英文原文(The Array class and coefficient-wise operations)
本页旨在提供有关如何使用Eigen的Array类的概述和说明。
什么是Array类?
与Matrix类用于线性代数计算不同的是,Array类提供了通用目的数组。此外,Array类提供了一种执行按系数运算的简单方法,这可能没有线性代数意义,例如对每一个元素都加一个常数或按系数将两个数组相乘。
Array类型
Array是一个类模板,采用与Matrix相同的模板参数。与Matrix一样,前三个模板参数是必需的:
Array<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>
最后三个模板参数是可选的。由于这与Matrix完全相同,因此不再在此解释,仅参考Matrix 类。
Eigen还提供了一些常见的类型定义,其方式类似于Matrix类型定义,但有一些细微差别,因为Array一词用于一维和二维数组。使用ArrayNt代表一维N个大小的标量,其中 N 和 t 是大小和标量类型,详见[矩阵与向量运算](# 3.1.2 矩阵与向量运算)。对于二维数组类型,使用 ArrayNNt 表示。示例如下:
| 类型 | 类型定义 |
|---|---|
| Array<float,Dynamic,1> | ArrayXf |
| Array<float,3,1> | Array3f |
| Array<double,Dynamic,Dynamic> | ArrayXXd |
| Array<double,3,3> | Array33d |
访问Array中的值
就像矩阵一样,使用括号运算符可以访问数组中的值。另外,<<运算符可用于初始化数组(使用逗号初始化)或打印它们。
例如:
#include <Eigen/Dense>
#include <iostream>int main()
{Eigen::ArrayXXf m(2,2);// assign some values coefficient by coefficientm(0,0) = 1.0; m(0,1) = 2.0;m(1,0) = 3.0; m(1,1) = m(0,1) + m(1,0);// print values to standard outputstd::cout << m << std::endl << std::endl;// using the comma-initializer is also allowedm << 1.0,2.0,3.0,4.0;// print values to standard outputstd::cout << m << std::endl;
}
输出如下:
1 2
3 51 2
3 4
有关逗号初始化的更多信息,请参阅高级初始化。
加法与减法
两个数组的加减法与矩阵相同。如果两个数组的大小相同,并且加法或减法是按系数进行的,则该操作有效。
Array 还支持 array + scalar 的表达形式,这实现了对数组的每个系数都加一个常数。并且这是在Matrix类中不能直接使用的功能。
示例如下:
#include <Eigen/Dense>
#include <iostream>int main()
{Eigen::ArrayXXf a(3,3);Eigen::ArrayXXf b(3,3);a << 1,2,3,4,5,6,7,8,9;b << 1,2,3,1,2,3,1,2,3;// Adding two arraysstd::cout << "a + b = " << std::endl << a + b << std::endl << std::endl;// Subtracting a scalar from an arraystd::cout << "a - 2 = " << std::endl << a - 2 << std::endl;
}
输出如下:
a + b = 2 4 65 7 98 10 12a - 2 =
-1 0 12 3 45 6 7
Array乘法
当然你可以将一个数组乘以一个标量,这与矩阵相同。数组与矩阵不同的地方在于自身相乘,矩阵将乘法解释为矩阵乘积,而数组将乘法解释为系数乘积。因此,两个数组相乘时它们必须具有相同的维度。
示例如下:
#include <Eigen/Dense>
#include <iostream>int main()
{Eigen::ArrayXXf a(2,2);Eigen::ArrayXXf b(2,2);a << 1,2,3,4;b << 5,6,7,8;std::cout << "a * b = " << std::endl << a * b << std::endl;
}
输出如下:
a * b = 5 12
21 32
其他按元素操作的运算
除了上述的加法、减法和乘法运算符之外,Array 类还定义了其他按系数计算的运算。例如,abs() 方法对每个元素取绝对值,而sqrt()计算每个系数的平方根。如果你有两个相同大小的数组,你可以调用min(.)来构造一个数组,其元素是两个给定数组对应元素的最小值。这些操作在以下示例中进行了说明:
#include <Eigen/Dense>
#include <iostream>int main()
{Eigen::ArrayXf a = Eigen::ArrayXf::Random(5);a *= 2;std::cout << "a =" << std::endl<< a << std::endl;std::cout << "a.abs() =" << std::endl<< a.abs() << std::endl;std::cout << "a.abs().sqrt() =" << std::endl<< a.abs().sqrt() << std::endl;std::cout << "a.min(a.abs().sqrt()) =" << std::endl<< a.min(a.abs().sqrt()) << std::endl;
}
输出如下:
a =1.36
-0.4221.131.191.65
a.abs() =1.36
0.4221.131.191.65
a.abs().sqrt() =
1.17
0.65
1.06
1.09
1.28
a.min(a.abs().sqrt()) =1.17
-0.4221.061.091.28
array和matrix表达式之间的转换
什么时候应该使用Matrix 类的对象,什么时候应该使用 Array 类的对象呢?
首先, Matrix 类和Array类的方法不通用。如果需要进行线性代数运算,例如矩阵乘法,那么应该使用 Matrix 类;如果需要做元素运算,那么应该使用Array类。然而,有时并没有那么简单,而是需要同时使用Matrix 类和Array类。这种情况下,需要将Matrix 转换为Array或相反。这样就可以使用所有操作,而不管对象声明为Matrix 还是Array。
Matrix 类有一个 .array() 方法可以将Matrix 转换为Array。同样,Array有一个 .matrix() 方法。由于Eigen表达式的抽象,这些转换发生在编译的时候,所以不需要任何运行时间成本。.array()和.matrix()既可以作为左值,也可以作为右值。
Eigen 禁止在表达式中混合使用Matrix 和Array。例如,不能将Matrix 和Array直接相加;运算符的操作对象要么都是Matrix,要么都是Array,但转换后是可以的。此规则的例外是赋值运算符,允许将Matrix 赋值给Array,或将将 Array 赋值给Matrix。
以下示例展示了如何通过使用.array()方法对 Matrix 对象使用Array的方法。例如,语句 result = m.array() * n.array() 将两个矩阵m和n都转换为数组,并使它们按系数相乘,再将结果分配给矩阵变量(这是合法的,因为Eigen允许将数组表达式赋值给矩阵变量)。
事实上,这种用例非常普遍,以至于Eigen为矩阵提供了一个 const .cwiseProduct(.) 方法来满足按元素相乘的需求。
示例如下:
#include <Eigen/Dense>
#include <iostream>using Eigen::MatrixXf;int main()
{MatrixXf m(2,2);MatrixXf n(2,2);MatrixXf result(2,2);m << 1,2,3,4;n << 5,6,7,8;result = m * n;std::cout << "-- Matrix m*n: --\n" << result << "\n\n";result = m.array() * n.array();std::cout << "-- Array m*n: --\n" << result << "\n\n";result = m.cwiseProduct(n);std::cout << "-- With cwiseProduct: --\n" << result << "\n\n";result = m.array() + 4;std::cout << "-- Array m + 4: --\n" << result << "\n\n";
}
输出如下:
-- Matrix m*n: --
19 22
43 50-- Array m*n: --5 12
21 32-- With cwiseProduct: --5 12
21 32-- Array m + 4: --
5 6
7 8
同样,如果array1和array2是数组,则表达式array1.matrix() * array2.matrix()可以计算他们的矩阵乘积。
接下来是一个更复杂一点的示例,表达式(m.array() + 4).matrix() * m对每一个元素都加4,然后计算表达式结果与矩阵m的矩阵乘积。类似的,表达式(m.array() * n.array()).matrix() * m按元素计算矩阵m和n的乘积,然后计算其结果与m的矩阵乘法。
示例如下:
#include <Eigen/Dense>
#include <iostream>using Eigen::MatrixXf;int main()
{MatrixXf m(2,2);MatrixXf n(2,2);MatrixXf result(2,2);m << 1,2,3,4;n << 5,6,7,8;result = (m.array() + 4).matrix() * m;std::cout << "-- Combination 1: --\n" << result << "\n\n";result = (m.array() * n.array()).matrix() * m;std::cout << "-- Combination 2: --\n" << result << "\n\n";
}
输出如下:
-- Combination 1: --
23 34
31 46-- Combination 2: --41 58
117 170
相关文章:
[Eigen中文文档] Array类与元素操作
文档总目录 本文目录什么是Array类?Array类型访问Array中的值加法与减法Array乘法其他按元素操作的运算array和matrix表达式之间的转换英文原文(The Array class and coefficient-wise operations) 本页旨在提供有关如何使用Eigen的Array类的概述和说明。 什么是A…...
python学习,全球有哪些特别好的社区推荐呢?
Surfshark可以访问全球社区学习的surfshark工具使用方法教程:qptool.net/shark.html 以下是一些全球范围内比较受欢迎的 Python 学习社区: 中文社区:csdn.net 优势:本土国语社区,获得相关知识与经验便利。 Python官…...
LC-1042. 不邻接植花(四色问题(染色法))
1042. 不邻接植花 难度中等198 有 n 个花园,按从 1 到 n 标记。另有数组 paths ,其中 paths[i] [xi, yi] 描述了花园 xi 到花园 yi 的双向路径。在每个花园中,你打算种下四种花之一。 另外,所有花园 最多 有 3 条路径可以进入…...
python实战应用讲解-【numpy科学计算】scikits-learn模块(附python示例代码)
目录 Numpy 安装scikits-learn 准备工作 具体步骤 Numpy 加载范例数据集 具体步骤...
大数据开发必备面试题Spark篇01
1、Hadoop 和 Spark 的相同点和不同点? Hadoop 底层使用 MapReduce 计算架构,只有 map 和 reduce 两种操作,表达能力比较欠缺,而且在 MR 过程中会重复的读写 hdfs,造成大量的磁盘 io 读写操作,所以适合高时…...
SpringBoot整合xxl-job详细教程
SrpingBoot整合xxl-job,实现任务调度说明调度中心执行器调试整合SpringBoot说明 Xxl-Job是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。Xxl-Job有…...
【MySQL--04】数据类型
文章目录1.数据类型1.1数据类型分类1.2数值类型1.2.1tinyint类型1.2.2bit类型1.2.3小数类型1.2.3.1 float1.2.3.2 decimal1.3字符串类型1.3.1 char1.3.2 varchar1.3.3char和varchar的比较1.4日期和时间类型1.5 enum和set1.5.1 enum1.5.2 set1.5.3 示例1.数据类型 1.1数据类型分…...
git 将其它分支的文件检出到工作区
主要是使用如下命令: git checkout [-f|--ours|--theirs|-m|--conflict<style>] [<tree-ish>] [--] <pathspec>…覆盖与 pathspec 匹配的文件的内容。当没有给出<tree-ish> (通常是一个commit)时,用 index 中的内容覆盖工作树…...
人工智能的最大危险是什么?
作者:GPT(AI智学习) 链接:https://www.zhihu.com/question/592107303/answer/2966857095 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 首先:人工智能为人类带来了很多益处&…...
rk3568点亮E-ink
rk3568 Android11/12 适配 E-ink “EINK”是英语ElectronicInk的缩写。翻译成中文为“电子墨水”。电子墨水由数百万个微胶囊(Microcapsules)所构成,微胶囊的大小约等同于人类头发的直径。每个微胶囊里含有电泳粒子──带负电荷的白色以及带正电荷的黑色粒子&#…...
如何将Springboot项目通过IDEA打包成jar包,并且转换成可执行文件
首先在IDEA打开你的项目,需要确认项目可以正常运行,然后点击页面右侧的Maven,运行Lifecycle下的package, 此时在项目的target目录下就可以看到一个jar包 这个时候你可以在jar包所在目录下执行cmd窗口,运行 java -jar campus-market-0.0.1-S…...
总结:网卡
一、背景 经常听到eth0,bond0这些概念,好奇他们的区别,于是有了此篇文章记录下。 二、介绍 网卡:即网络接口板,又称网络适配器或NIC (网络接口控制器),是一块被设计用来允许计算机在计算机网络上进行通讯…...
Java这么卷,还有前景吗?
“Java很卷”、“大家不要再卷Java了”,经常听到同学这样抱怨。但同时,Java的高薪也在吸引越来越多的同学。不少同学开始疑惑:既然Java这么卷,还值得我入行吗? 首先先给你吃一颗定心丸:现在选择Java依然有…...
后端简易定时任务框架选择(Python/Go)--gocron
文章目录前言实现后语前言 在使用Python的web框架中,包括flask/Django,其中大量用到celery;celery作为异步任务使用的多,同时也会用celery来跑些定时任务,比如每晚定时跑脚本、跑数据统计等闲时任务。但随着任务量的增…...
【GStreamer学习】之GStreamer基础教程
目标 没有什么比在屏幕上打印出“Hello World”更能获得对软件库的第一印象了! 但是由于我们正在学习多媒体框架,所以我们将输出“Hello World!”改为播放视频。 不要被下面的代码量吓到:只有 4 行是真正需要的, 其…...
各类Round-Robin总结,含Verilog实现
1. Fixed Priority Arbitrary 固定优先级就是指每个req的优先级是不变的,即优先级高的先被处理,优先级低的必须是在没有更高优先级的req的时候才会被处理。所以转化为数学模型就是找出req序列中第一个为1的位置,然后将其转换为onehot。 例如: req[3:0] = 4b1100 ==> g…...
《软件设计师-知识点》
1、指令流水线 (一)一条指令的执行过程可分为三个阶段:取指、分析、执行。 取指:根据PC(程序计数器)内容访问主存储器,取出一条指令送到IR(指令寄存器)中。 分析&…...
mysql 同义词_数据库中的同义词synonym
一、Oracle数据只有一个实例(简单理解就是Oracle 只能建立一个数据库,不像MySQL,它下面可以创建N个库),那么Oracle是根据用户灵活去管理的;这点读起来、理解 起来也不那么难,但是除非自己亲自实现一把才理解深入点&…...
Nacos共享配置
本文介绍一下Nacos作为配置中心时,如何读取共享配置 我的环境 Windows10JDK8SpringCloud:Finchley.RELEASESpringBoot:2.0.4.RELEASEspring-cloud-alibaba-dependencies:0.2.2.RELEASENacos-server:1.0.1 本文的项目…...
数据结构——排序(4)
作者:几冬雪来 时间:2023年4月12日 内容:数据结构排序内容讲解 目录 前言: 1.快速排序中的递归: 2.小区间优化: 3.递归改非递归: 4.归并排序: 5.归并排序的非递归形式&…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
