Eigen-矩阵切片和索引

矩阵切片和索引

  • 一、概述
  • 二、基本的切片
  • 三、编译时间大小和增量
  • 四、相反的顺序
  • 五、索引数组
  • 六、自定义索引列表

一、概述

本页介绍了操作符 () 为索引子集行和列提供的多种可能性。这个API已经在特性3.4中引入。它支持块API提出的所有特性,以及更多。特别是,它支持切片,包括在矩阵中均匀间隔的一组行、列或元素,或者从索引数组中索引。

上述所有操作都通过通用的下面的API方法处理。

DenseBase::operator()(const RowIndices&const ColIndices&)

每个参数可以是:

  • 索引单行或列的整数,包括符号索引。
  • 符号 Eigen::all 表示按递增顺序排列的全部行或列。
  • 一个由 Eigen::seq、Eigen::seqN或Eigen::placeholders::lastN 函数构造的算术序列。
  • 任何一维矢量/整数数组,包括Eigen的矢量/数组、表达式、std::vector、std::array以及普通C数组:int[N]。

更一般地说,它可以接受暴露以下两个成员函数的任何对象:

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

其中<integral type>表示与Eigen::Index(即std::ptrdiff_t)兼容的任何整数类型。

二、基本的切片

通过 Eigen::seq 或 Eigen::seqN 函数(其中“seq”表示等差数列),可以在矩阵或向量中获得一组均匀间隔的行、列或元素。他们的签名摘要如下:

功能描述示例
seq (firstIdx, lastIdx)表示从firstdx到lastdx的整数序列seq (2,5) <=> {2,3,4,5}
seq (firstIdx, lastIdx, incr)相同的,但使用增量incr从一个索引推进到下一个索引Seq (2,8,2) <=> {2,4,6,8}
seqN (firstIdx, size)表示从firstIdx开始的大小整数序列seqN(2,5) <=> {2,3,4,5,6}
seqN (firstIdx, size, incr)相同的,但使用增量incr从一个索引推进到下一个索引seqN(2,3,3) <=> {2,5,8}

还可以在 Eigen::last 符号的帮助下定义 firstdx 和 lastdx 参数,该符号表示通过 operator() 将等差数列传递给底层矩阵/向量后的最后一行、最后一列或最后一个元素的索引。下面是二维数组/矩阵 A 和一维数组/向量 v 的一些示例。

意图代码块Block- api等价
左下角从第i行开始,有n列A(seq(i, last), seqN (0, n))A.bottomLeftCorner (A.rows () - i, n)
块从i开始,j有m行n列A(seqN(i, m), seqN(i, n))A.block (i, j, m, n)
块从i0,j0开始,到i1,j1结束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行奇数AA(seqN(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(seq(i, last))v.tail(v.size() - i)
v的最后n个元素v(seq(last + 1 - n, last))v.tail (n)

正如在最后一个示例中所看到的,引用最后n个元素(或行/列)编写起来有点麻烦。对于非默认的增量,这变得更加棘手和容易出错。下面是 Eigen::placeholders::lastN(size) 和 Eigen::placeholders::lastN(size,incr):

意图代码块Block - api等价
v的最后n个元素v(lastN(n))v.tail (n)
大小为m乘以n的A的右下角v(lastN(m), lastN(n))A.bottomRightCorner(m,n)
大小为m乘以n的A的右下角v(lastN(m), lastN(n))A.bottomRightCorner(m,n)
最后n列取1列除以3A(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>))

四、相反的顺序

还可以使用负增量按降序枚举行/列索引。例如,从第 20 列到第 10 列A的1 / 2

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

从最后一行开始的最后n行:

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

您还可以使用 ArithmeticSequence::reverse() 方法来反转其顺序。因此,前面的例子也可以写成:

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

五、索引数组

泛型操作符()也可以接受任意的行或列索引列表作为输入,存储形式可以是 ArrayXi、std::vector、std::array<int,N> 等。

下面的例子就是用用 ind 里的数作为索引,去取A中的指定列构成的新矩阵。

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";// 输出
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";//输出
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";//输出
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

当传递具有编译时大小的对象(如Array4i、std::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";//输出
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/711566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试错误或者难点记录

数据库方向 1. mysql数据库中的DATE_FORMAT函数作用是什么&#xff1f;sql server有相同作用的函数吗&#xff1f; DATE_FORMAT函数是格式化日期或时间类型的数据&#xff0c;有两个参数&#xff0c;第一个参数是日期或者时间数据&#xff0c;第二个参数是格式化字符串&#…

如何用ChatGPT+GEE+ENVI+Python进行高光谱,多光谱成像遥感数据处理?

原文链接&#xff1a;如何用ChatGPTGEEENVIPython进行高光谱&#xff0c;多光谱成像遥感数据处理&#xff1f; 第一&#xff1a;遥感科学 从摄影侦察到卫星图像 遥感的基本原理 遥感的典型应用 第二&#xff1a;ChatGPT ChatGPT可以做什么&#xff1f; ChatGPT演示使用 …

工厂模式:没你想像的那么难

工厂模式 工厂模式是一种创建型设计模式&#xff0c;它允许创建对象而无需指定将要创建的对象的具体类。它通过将对象的创建委托给一个单独的方法或类来完成&#xff0c;从而隐藏了对象的实例化逻辑。这样可以提高代码的灵活性&#xff0c;减少了代码中的重复和耦合。 在工厂…

2021年下半年教师资格证考试《高中信息技术》题

4.使用某转码软件对一段时长为2分钟的AVI视频进行转码&#xff0c;转码后的视频信息如图4所示&#xff0c;计算存储该视频文件所需的空间大小为&#xff08;C &#xff09;。 A18MB B36MB C60MB D512MB 6.某21位二进制代码100101011010011110101&#xff0c;已知该代码由3个…

html基础操练和进阶修炼宝典

文章目录 1.超链接标签2.跳锚点3.图片标签4.表格5.表格的方向属性6.子窗口7.音视频标签8.表单9.文件上传10.input属性 html修炼必经之路—各种类型标签详解加展示&#xff0c;关注点赞加收藏&#xff0c;防止迷路哦 1.超链接标签 <!DOCTYPE html> <html lang"en…

再议【每天进步一点点】

概述 之前听姜胡说&#xff0c;讲到了他自己日更博客的故事&#xff0c;也就是每天去更新一篇博客文章。 日更&#xff0c;其实是一件很可怕的事情。 先不说文章的深度如何&#xff0c;单单从时间的耗费上&#xff0c;文字的积累上&#xff0c;以及对事物的敏感度上&#xf…

vue实现自定义树形穿梭框功能

需求&#xff1a; 我们在开发过程中&#xff0c;会遇到需要将一个数据选择做成穿梭框&#xff0c;但是要求穿梭框左侧为树形结构、右侧为无层级结构的数据展示&#xff0c;ElementUI自身无法在穿梭框中添加树形结构&#xff0c;网上搜到了大佬封装的插件但是对于右侧的无树形结…

【从Python基础到深度学习】9.Python 语法基础

一、常量与变量 常量:程序中使用的具体的数、字符。在运行过程中&#xff0c;值无法更改 变量:表示一一个存储单元&#xff0c;其中存储的值可以修改 如&#xff1a;a5,b6 变量命名: 1、只能包含字母、数字、下划线 2、只能以字母、下划线开头 3、不要使用关键字作为变量名称 …

不知道伦敦银模拟账户该如何使用?至少3个用法

由于模拟交易的特别属性&#xff0c;很多人对模拟交易并不用心&#xff0c;假的资金用心干什么&#xff1f;就算交易得再好&#xff0c;盈利得再多&#xff0c;假的资金会变成真的吗&#xff1f;因此当然不会这么用心对待伦敦银模拟账户交易账户。实际上&#xff0c;这种观点是…

Python 操作数据结构队列 queue和 双端队列 deque

“”" 队列&#xff08;Queue&#xff09;和双端队列&#xff08;Deque, Double-ended Queue&#xff09;都是线性数据结构&#xff0c;但它们在操作上有所不同&#xff1a; 队列&#xff08;Queue&#xff09;&#xff1a; 队列遵循先进先出&#xff08;FIFO, First-In…

List集合的Stream流式操作实现数据类型转换

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 拓展&#xff1a; 1、Collectors.toList() 2、Collectors.toCollection(ArrayList::new) 3、Collectors.toCollection(LinkedList::new) 4、Collectors.toCollection(LinkedHashSet::new) 5、Collector…

MAC M1 安装mongodb7.0.5 版本

1、进入官网 Download MongoDB Community Server | MongoDBDownload MongoDB Community Server non-relational database to take your next big project to a higher level!https://www.mongodb.com/try/download/community 2、选择版本 3、下载后解压 放到 /usr/local 并修改…

Facebook Messenger链接分享:如何创建链接并设置自动化内容

Facebook Messenger链接是指基于Facebook用户名创建的会话链接&#xff0c;用户可以在其Facebook页面的设置部分复制此链接进行分享。然后将该链接直接粘贴到独立站、电子邮件、名片或社交媒体中&#xff0c;让目标受众可以一键进入对话。为了满足某些商家的需求&#xff0c;Fa…

vue3中的ref和reactive的区别

vue3中的ref和reactive的区别 1、响应式数据2、ref3、reactive4、ref VS reactive5、往期回顾总结&#xff1a; 1、响应式数据 处理响应式数据时到底是该用ref还是reactive... 响应式数据是指在 Vue.js 中&#xff0c;当数据发生变化时&#xff0c;相关的视图会自动更新以反映…

【bash】2、手把手实现一个 bash shell:多个机器批量执行 shell 命令,支持 ip 补全

文章目录 一、需求&#xff1a;多台机器批量远程执行 shell 命令1.1 业务需求拆解为脚本需求1.2 帮助函数&#xff1a;使用说明文档1.3 main 函数框架 二、功能&#xff1a;单机 sshp 执行2.1 fullip 函数&#xff1a;实现 ip 补全2.1.1 参数说明2.1.2 定义全局变量2.1.3 实现&…

Cu-HCP-H035 Cu-HCP-R250铜合金高精度零部件

Cu-HCP-H035 Cu-HCP-R250铜合金高精度零部件 CDA102-3/4H EN1982-CC333G EN1982-CC492K BS1400-LG4 EN1982-CC491K BS1400-LG2 CuNi18Zn19Pb1/CW408J CuNi12Zn38Mn5Pb2/CW407J CuNi12Zn30Pb1/CW406J CuNi12Zn29/CW405J CuNi12Zn25Pb1/CW404J CuNi10Zn42Pb2/CW402J CuNi10Zn27/C…

Pytorch 复习总结 4

Pytorch 复习总结&#xff0c;仅供笔者使用&#xff0c;参考教材&#xff1a; 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为&#xff1a;Pytorch 深度学习计算。 本文先介绍了深度学习中自定义层和块的方法&#xff0c;然后介绍了一些…

基于Beego 1.12.3的简单website实现

参考 用Beego开发web应用 https://www.cnblogs.com/zhangweizhong/p/10919672.htmlBeego官网 Homepage - beego: simple & powerful Go app frameworkbuild-web-application-with-golang https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/pr…

源码的角度分析Vue2数据双向绑定原理

什么是双向绑定 我们先从单向绑定切入&#xff0c;其实单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新。那么双向绑定就可以从此联想到&#xff0c;即在单向绑定的基础上&#xff0c;用户更新…

微信开发者工具-代码管理和码云Github远程仓库集成

目录 思考&#xff1a;IDE如何进行代码管理 代码管理方式 一、自身提供服务 二、Git 扩展 1、环境准备 2、创建项目代码 3、进行项目Git初始化 4、在码云新建远程仓库 5、将项目进行远程仓库关联 三、SVN扩展 四、代码管理 思考&#xff1a;IDE如何进行代码管理 初识开…