博客
关于我
Eigen库入门:数组与块
阅读量:270 次
发布时间:2019-03-01

本文共 2555 字,大约阅读时间需要 8 分钟。

前言

在上一篇博文中,我们探讨了Eigen库中Matrix类的基础运算。然而,Eigen库的Array类提供了更加灵活和通用的数组操作,这对于处理各种算术和元素运算非常有用。本文将深入探讨Array类的特性及其操作方法。

一、数组类型

Eigen库中的Array类是一个高度通用的数组类型,它不具备线性代数的严格含义,但提供了极为便捷的运算方式。与Matrix类不同,Array类允许对数组执行多种运算,包括加法、乘法、标量运算以及元素操作等。

1. 定义Array数组

Array类是一个模板类,其定义方式与Matrix类类似,但参数的含义有所不同。Array类的定义方式如下:

Array
array_name;

其中,typename指定数组的数据类型,rowscols分别指定行数和列数。Array类还提供了多种预定义的TypeDef,便于快速定义数组:

Type Typedef
Array<float, Dynamic, 1> ArrayXf
Array<float, 3, 1> Array31f
Array<float, Dynamic, Dynamic> ArrayXXf
Array<float, 2, 3> Array23f

例如,可以定义一个3行1列的浮点型数组:

Array31f array_31f;

此外,Array类还支持动态大小的数组定义,这对于某些应用场景非常有用。

2. 输入输出数组元素

Eigen库中的Array类与Matrix类在输入输出元素方面具有相同的接口,因此无需额外说明。在编写代码时,可以直接使用类似的方式进行赋值和读取操作。

3. 数组的四则运算

Eigen库中的Array类支持丰富的四则运算,但与Matrix类有一些关键差异。在标量加法和减法操作中,Array类允许将标量直接加到数组中的每个元素中,而Matrix类则不支持这种操作。此外,数组乘法定义为对应元素相乘,前提是两个数组的大小必须相同。

ArrayXXf a(3,3); ArrayXXf b(3,3); a << 1,2,3, 4,5,6, 7,8,9; b << 1,2,3, 1,2,3, 1,2,3; cout << "a + b = " << endl << a + b << endl; // 输出结果如下:// a + b =// 2 4 6// 5 7 9// 8 10 12

此外,Array类还支持与标量的加法和减法操作:

ArrayXXf a(3,3); a << 1,2,3, 4,5,6, 7,8,9; a - 2; // 输出结果如下:// a - 2 =// -1 0 1// 2 3 4// 5 6 7

4. 数组的运算API

Eigen库中的Array类提供了丰富的数学运算API,可以直接调用这些方法来执行各种元素操作。这些API包括元素的绝对值、平方、立方、对数、指数、正弦、余弦等函数,适用于复杂的数学运算。

ArrayXXf a(2,2); a << 1,2, 3,4; a.abs2(); // 输出所有元素的平方绝对值数组// 输出结果如下:// [1, 2, 3, 4] 的平方绝对值为 [1,4,9,16]

5. 数组与矩阵的转换

在某些情况下,可能需要将Array数组与Matrix矩阵进行转换以进行更高级的线性代数运算。Eigen库为此提供了方便的API:Array类可以通过.matrix()方法将其转换为Matrix类,反之亦然。需要注意的是,在表达式中不能混用Matrix和Array进行操作,必须确保两者类型一致。

MatrixXf m(2,2); m << 1,2,3,4; ArrayXXf a = m.array(); // 将Matrix转换为Array ArrayXXf b = a.matrix(); // 将Array转换为Matrix

二、块操作

Eigen库中的块操作允许用户在矩阵或数组中定义和操作矩形区域。块操作非常有用,尤其是在需要对矩阵或数组中的特定区域进行操作时。

1. 定义块

块操作可以通过.block()方法进行定义。固定大小的块可以通过matrix.block(p,q)定义,动态大小的块可以通过matrix.block(i,j,p,q)定义,其中i和j是起始索引,p和q是块的行数和列数。

MatrixXf m(4,4); m << 1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16; cout << "中间2x2的块:" << endl << m.block(1,1,2,2) << endl; // 输出结果如下:// 中间2x2的块:// 6 7// 10 11

同样,Array类也支持块操作:

Array44f a; a << 0.6,0.6,0.6,0.6, 0.6,0.6,0.6,0.6, 0.6,0.6,0.6,0.6; a.block(1,1,2,2) = Array22f(1,2,3,4); // 输出结果如下:// 拿到中间2x2的块后赋值// 1 2 3 4// 5 6 7 8// ...

2. 单行与单列

对于某些特定的操作,直接获取矩阵或数组的单行或单列可能更高效。Eigen库为此提供了.col()和.row()方法,可以直接获取矩阵或数组的行或列。例如,可以通过.col(2)方法获取第三列的数据。

MatrixXf m(3,3); m << 1,2,3,4,5,6,7,8,9; cout << "第二行:" << m.row(1) << endl; // 输出结果如下:// 第二行: 4 5 6

3. 向量的块操作

Eigen库还为向量和一维数组提供了块操作的支持。通过段操作(segment)可以对向量的特定区域进行操作。例如,可以通过segment(1,4)指定从第二个元素开始的四个元素进行操作。

ArrayXf v(6); v << 1,2,3,4,5,6; v.segment(1,4) *= 2; // 输出结果如下:// 1// 4// 6// 8// 10// 6

转载地址:http://opnv.baihongyu.com/

你可能感兴趣的文章
npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
查看>>
npm 下载依赖慢的解决方案(亲测有效)
查看>>
npm 安装依赖过程中报错:Error: Can‘t find Python executable “python“, you can set the PYTHON env variable
查看>>
npm.taobao.org 淘宝 npm 镜像证书过期?这样解决!
查看>>
npm—小记
查看>>
npm上传自己的项目
查看>>
npm介绍以及常用命令
查看>>
NPM使用前设置和升级
查看>>
npm入门,这篇就够了
查看>>
npm切换到淘宝源
查看>>
npm切换源淘宝源的两种方法
查看>>
npm前端包管理工具简介---npm工作笔记001
查看>>
npm包管理深度探索:从基础到进阶全面教程!
查看>>
npm升级以及使用淘宝npm镜像
查看>>
npm发布包--所遇到的问题
查看>>
npm发布自己的组件UI包(详细步骤,图文并茂)
查看>>
npm和package.json那些不为常人所知的小秘密
查看>>
npm和yarn清理缓存命令
查看>>
npm和yarn的使用对比
查看>>
npm如何清空缓存并重新打包?
查看>>