开源地址,欢迎star
Eigen: Slicing and Indexing

本文展示如果使用操作运算符operator() 来索引行和列的子集。这个API是在Eigen 3.4中完成的。它拥有 block API提供的所有功能,甚至更多。特别的,它支持包含提取一行、一列、单个元素的操作以及等间隔的从矩阵或者数组中提取元素。

概述

上述所以提到的操作都是用DenseBase::operator()(const RowIndices&, const ColIndices&)来完成的,每一个参数可以是:

  • 索引单行或列的整数,包括符号索引
  • 符号Eigen::all表示按递增顺序排列的所有行或列
  • Eigen::seq, Eigen::seqN或者 Eigen::placeholders::lastN 函数构造的ArithmeticSequence
  • 任意一维整数向量、阵列,形式如Eigen数组、阵列、表达式,std::vector , C的数组int[N]

更一般的,该函数可以接受任何有下列两个成员函数接口的对象

<integral type> operator[](<integral type>) const;<integral type> size() const;

其中<integral type> 代表任何可以与Eigen::index兼容的整数,如std::ptrdiff_t

基本的切片

通过Eigen::seqEigen::seqN函数,取矩阵或向量中均匀间隔的一组行、列或元素,其中seq代表等差数列。他们的用法如下:

function description example
seq(firstIdx,lastIdx) 返回从firstIdxlastIdx的整数 seq(2,5) <=> {2,3,4,5}
seq(firstIdx,lastIdx,incr) 与上面相同,但是索引每次增加incr seq(2,8,2) <=> {2,4,6,8}
seqN(firstIdx,size) firstIdx开始,索引每次加1,总的个数为size seqN(2,5) <=> {2,3,4,5,6}
seqN(firstIdx,size,incr) 与上述相同,索引每次增加incr seqN(2,3,3) <=> {2,5,8}

一旦等差序列通过operator()传递给它,firststidxlasttidx参数也可以用Eigen::last符号来定义,该符号表示矩阵/向量的最后一行、最后一列或元素的索引,使用如下:

Intent Code Block-API equivalence
Bottom-left corner starting at row i with n columns A(seq(i,last), seqN(0,n)) A.bottomLeftCorner(A.rows()-i,n)
Block starting at i,j having m rows, and n columns A(seqN(i,m), seqN(i,n)) A.block(i,j,m,n)
Block starting at i0,j0 and ending at i1,j1 A(seq(i0,i1), seq(j0,j1) A.block(i0,j0,i1-i0+1,j1-j0+1)
Even columns of A A(all, seq(0,last,2))
First n odd rows A A(seqN(1,n,2), all)
The last past one column A(all, last-1) A.col(A.cols()-2)
The middle row A(last/2,all) A.row((A.rows()-1)/2)
Last elements of v starting at i v(seq(i,last)) v.tail(v.size()-i)
Last n elements of v v(seq(last+1-n,last)) v.tail(n)

正如在上一个示例中看到的,引用最后n个元素(或行/列)编写起来有点麻烦。使用非默认增量时,这将变得更加棘手和容易出错。因此,Eigen提供了Eigen::placeholders::lastN(size)和Eigen::placeholders::lastN(size,incr) 函数来完成最后几个元素的提取,用法如下:

Intent Code Block-API equivalence
Last n elements of v v(lastN(n)) v.tail(n)
Bottom-right corner of A of size m times n v(lastN(m), lastN(n)) A.bottomRightCorner(m,n)
Bottom-right corner of A of size m times n v(lastN(m), lastN(n)) A.bottomRightCorner(m,n)
Last n columns taking 1 column over 3 A(all, lastN(n,3))

编译时的大小和增量

在性能方面,Eigen和编译器可以利用编译时的大小和增量。为了这个目的,你可以使用Eigen::fix<val>在编译时刻强制指定大小。而且,它可以和Eigen::last符号一起使用:

v(seq(last-fix<7>, last-fix<2>))

在这个例子中,Eigen在编译时就知道返回的表达式有6个元素。它等价于:

v(seqN(last-7, fix<6>))

我们可以查看A的偶数列,如:

A(all, seq(0,last,fix<2>))

倒序

我们可以把增量设置为负数,如该例子实现A的20到10列中取一半:

A(all, seq(20, 10, fix<-2>))

从最后一个开始,取n个数:

A(seqN(last, n, fix<-1>), all)

也可以使用函数ArithmeticSequence::reverse() 方法来反转序列,之前的例子也可以写作:

A(lastN(n).reverse(), all)

数组的索引

operator()输入的也可以是ArrayXi, std::vector<int>, std::array<int,N>,如:

Example:
std::vector<int> ind{4,2,5,5,3};
MatrixXi A = MatrixXi::Random(4,6);
cout << "Initial matrix A:\n" << A << "\n\n";
cout << "A(all,ind):\n" << A(Eigen::placeholders::all,ind) << "\n\n";
Output:
Initial matrix A:7   9  -5  -3   3 -10-2  -6   1   0   5  -56  -3   0   9  -8  -86   6   3   9   2   6A(all,ind):3  -5 -10 -10  -35   1  -5  -5   0-8   0  -8  -8   92   3   6   6   9
MatrixXi A = MatrixXi::Random(4,6);
cout << "Initial matrix A:\n" << A << "\n\n";
cout << "A(all,{4,2,5,5,3}):\n" << A(Eigen::placeholders::all,{4,2,5,5,3}) << "\n\n";
Output:
Initial matrix A:7   9  -5  -3   3 -10-2  -6   1   0   5  -56  -3   0   9  -8  -86   6   3   9   2   6A(all,{4,2,5,5,3}):3  -5 -10 -10  -35   1  -5  -5   0-8   0  -8  -8   92   3   6   6   9
ArrayXi ind(5); ind<<4,2,5,5,3;
MatrixXi A = MatrixXi::Random(4,6);
cout << "Initial matrix A:\n" << A << "\n\n";
cout << "A(all,ind-1):\n" << A(Eigen::placeholders::all,ind-1) << "\n\n";
Output:
Initial matrix A:7   9  -5  -3   3 -10-2  -6   1   0   5  -56  -3   0   9  -8  -86   6   3   9   2   6A(all,ind-1):
-3  9  3  3 -50 -6  5  5  19 -3 -8 -8  09  6  2  2  3

当传递一个具有编译时大小的对象(如Array4istd::array<int, N>或静态数组)时,返回的表达式也会显示编译时维度。

自定义索引列表

更一般的,operator()可以接受任何与下列兼容的T类型的对象ind:

Index s = ind.size(); or Index s = size(ind);
Index i;
i = ind[i];

这意味着您可以轻松地构建自己的序列生成器并将其传递给operator()。下面是一个例子,扩大一个给定的矩阵,同时通过重复填充额外的第一行和列:

struct pad {Index size() const { return out_size; }Index operator[] (Index i) const { return std::max<Index>(0,i-(out_size-in_size)); }Index in_size, out_size;
};Matrix3i A;
A.reshaped() = VectorXi::LinSpaced(9,1,9);
cout << "Initial matrix A:\n" << A << "\n\n";
MatrixXi B(5,5);
B = A(pad{3,5}, pad{3,5});
cout << "A(pad{3,N}, pad{3,N}):\n" << B << "\n\n";Output:
Initial matrix A:
1 4 7
2 5 8
3 6 9A(pad{3,N}, pad{3,N}):
1 1 1 4 7
1 1 1 4 7
1 1 1 4 7
2 2 2 5 8
3 3 3 6 9

Eigen官方文档中文翻译——切片和索引——Eigen: Slicing and Indexing相关推荐

  1. ElasticSearch Java High level Rest Client 官方文档中文翻译(一)

    ElasticSearch Java High level Rest Client 官方文档中文翻译 一 纯粹记录自己在看官网的es rest high level api 时的翻译笔记,可以对照着官 ...

  2. 【开源项目推荐】Android Jetpack 官方文档 中文翻译

    Jetpack 是 Android 软件组件的集合,使您可以更轻松地开发出色的 Android 应用.这些组件可帮助您遵循最佳做法.让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的 ...

  3. Spring官方文档中文翻译

    准备做个Spring官方文档全翻译专栏以下是大目录, 本翻译是基于Spring5 Core Technologies

  4. Sencha Cmd 6 和 Ext JS 6 指南文档(部分官方文档中文翻译)

    近期组织了几个程序员网友,正在翻译一部分官方的Sencha Cmd 6 和 Ext JS 6 指南文档. 眼下还没翻译完,大家能够先看看 Sencha Cmd 6 和 Ext JS 6 指南文档  ( ...

  5. EdgeX Foundary 2.1Jakarta版官方文档中文翻译

    基于机器翻译,部分翻译有修订,不清楚的地方请参阅官方文档. 引言 EdgeX Foundry是一个开源的.供应商中立的.灵活的.可互操作的.位于网络边缘的软件平台,与设备.传感器.执行器和其他物联网对 ...

  6. OAuth2.0官方文档中文翻译

    http://page.renren.com/699032478/note/708597990 (一)背景知识 OAuth 2.0很可能是下一代的"用户验证和授权"标准,目前在国内 ...

  7. python3官方文档 中文-Python 3.7 官方文档中文翻译召集

    geelaw 2018-08-07 00:59:47 +08:00 @LudwigWS #22 在你给出的第一个链接里面的第一个例子,前后分句的主语是相同的,只是重复了一次.注意 > 小明虽然考 ...

  8. MediaCodec 官方文档中文翻译

    MediaCodec MediaCodec 类可以用来访问底层媒体编解码器,如编码器/解码器组件.是Android底层多媒体支持框架的一部分(通常和MediaExtractor,MediaSync,M ...

  9. wireshark协议插件开发--官方文档中文翻译

    1. 工作机制 每个解剖器(dissector )解码其协议的一部分,然后将解码交给后续解剖器以获得封装协议. 每个解剖都从Frame解剖器开始,它解剖捕获文件本身的数据包细节(例如时间戳).从那里它 ...

最新文章

  1. 网盘纷退场 “云存储”仍是刚需
  2. java解压多目录Zip文件(解决中文乱码问题)--转载
  3. Flask开发系列之Web表单
  4. Python+Selenium学习笔记8 - 多表单多窗口切换
  5. android宿舍管理系统源码,基于android操作系统的手机宿舍管理系统使用手册
  6. 领导力十律_关于开放领导力的10个最受欢迎的故事
  7. 如何动态修改select的值_SQL成长记录02-SELECT语句
  8. Cocos2dx 学习之CCTableView
  9. java创建项目出现怎么办_maven创建项目后main/java missing的解决方法
  10. 高等代数---二次型
  11. 在LaTeX中添加Visio绘图
  12. Android 批量修改文件格式/文件名的骚操作
  13. flask—本地图片,视频上传
  14. 西部世界:生存(WestLand Survival) 游戏攻略
  15. vs2015 :“64位调试操作花费的时间比预期要长“,无法运行调试解决办法
  16. php weixin provider,14、ABPZero系列教程之拼多多卖家工具 新建微信公众号模块
  17. 计算机基础知识与公文写作,公文写作与计算机基础知识
  18. linux 查看系统命令
  19. 《清醒思考的艺术》-罗尔夫 多贝利
  20. 特斯拉充电电流设置多大_【干货】特斯拉电动汽车4种充电方式详解!

热门文章

  1. Linux基础—” Linux静态动态库及相关编程“ 面试必问的知识点你了解了嘛
  2. 使用Python完成自动录入信息
  3. ipad触屏笔有必要买吗?苹果平板第三方触控笔推荐
  4. Unity中的签到系统
  5. 国产机器人抢滩进行时!优艾智合引领智能制造浪潮
  6. uni-app设置APP启动页显示时长
  7. Python语言的前景、方向、优势、就业情况分析
  8. 在登录的状态下获取登录的个人信息
  9. 写给迷茫的你:九年京东测试工程师的职业规划思考!
  10. EDraw 图示制作专家 流程图