切片和索引
本节介绍了operator()索引行和列的子集所提供的众多可能性。此 API 已在 Eigen 3.4 中引入。它支持块 API提出的所有功能。特别是,它支持切片,包括获取一组行、列或元素,在矩阵内均匀分布或从索引数组索引。
概述
所有上述操作都通过通用 DenseBase::operator()(const RowIndices&, const ColIndices&) 方法处理。每个参数可以是:
- 索引单个行或列的整数,包括符号索引。
- 符号
Eigen::all表示按递增顺序排列的相应行或列的整个集合。 - 由
Eigen::seq、Eigen::seqN或Eigen::placeholders::lastN函数构造的ArithmeticSequence。 - 任何一维向量/整数数组,包括 Eigen 向量/数组、表达式、std::vector、std::array 以及普通 C 数组:
int[N].
更一般地说,它可以接受任何公开以下两个成员函数的对象:
<integral type> operator[](<integral type>) const;
<integral type> size() const;
其中Eigen::Index代表任何整数类型。
基本切片
通过Eigen::seq或Eigen::seqN函数获取一组在矩阵或向量中均匀分布的行、列或元素,其中“seq”代表算术序列。他们的签名总结如下:
| 功能 | 描述 | 例子 |
|---|---|---|
seq(firstIdx,lastIdx)seq |
表示范围从firstIdx到的整数序列lastIdx |
seq(2,5) <=> {2,3,4,5} |
seq(firstIdx,lastIdx,incr) |
与上同,但使用增量incr从一个索引前进到下一个索引 |
seq(2,8,2)<=> {2,4,6,8} |
seqN (firstIdx,size) |
size表示从开始的整数序列firstIdx |
seqN(2,5) <=> {2,3,4,5,6} |
seqN(firstIdx,size,incr) |
与上同,但使用增量incr从一个索引前进到下一个索引 |
seqN(2,3,3) <=> {2,5,8} |
firstIdx和参数也可以在 Eigen::last 符号的帮助下定义,该lastIdx符号表示当算术序列通过 operator() 传递给它时,底层矩阵/向量的最后一行、列或元素的索引。以下是 2D array/matrixA和 1D array/vector的一些示例v。
| 意图 | 代码 | 块 API 等效性 |
|---|---|---|
i从有n列的行开始的左下角 |
A( seg(i, last ), segN (0,n)) | A.bottomLeftCorner(A.rows()-i,n) |
从i,j 开始的具有m行和n列的块 |
A( segN (i,m), segN (i,n)) | A.block(i,j,m,n) |
i0从,j0 开始到 ,j1 结束i1的块 |
A(seq(i0,i1),seq(j0,j1) | A.block(i0,j0,i1-i0+1,j1-j0+1) |
| A的偶数列 | A(all,seq(0,last,2)) | |
第一个n奇数行 A |
A( segN (1,n,2),all) | |
| 最后一栏 | A(all,last-1) | A.col(A.cols()-2) |
| 中间一排 | A(last/2,all) | A.row((A.rows()-1)/2) |
| v 的最后一个元素从 i 开始 | v(seg (i, last )) | v.tail(v.size()-i) |
v 的最后一个n元素 |
v(seg (last+1-n,last)) | v.tail(n) |
如上一个示例所示,引用最后 n 个元素(或行/列)编写起来有点麻烦。使用非默认增量,这变得更加棘手和容易出错。这里是Eigen::placeholders::lastN(size)和Eigen::placeholders::lastN(size,incr):
| 意图 | 代码 | 块 API 等效性 |
|---|---|---|
v 的最后一个n元素 |
v(最后N(n)) | v.tail(n) |
m大小乘以 A 的右下角n |
v(最后N(m), 最后N(n)) | A.bottomRightCorner(m,n) |

本文详细解读了Eigen 3.4中关于矩阵和向量切片与索引的高级API,涵盖了整数、算术序列、向量数组、自定义索引列表以及块API等操作,帮助读者理解并高效利用这些功能进行矩阵处理。

3058

被折叠的 条评论
为什么被折叠?



