Eigen-Block块操作

Block块操作

  • 一、使用块操作
  • 二、列和行
  • 三、Corner-related操作
  • 四、向量的块运算

块是矩阵或数组的矩形部分。块表达式既可以用作右值,也可以用作左值。与通常的Eigen表达式一样,只要让编译器进行优化,这种抽象的运行时成本为零。优化都是自动的无需我们考虑太多。

一、使用块操作

Eigen中最通用的块操作称为.block()。有两个版本,语法如下:

块操作动态大小的块表达式固定大小块表达式
大小为(p,q)的块,从(i,j)开始matrix.block (i, j, p, q);matrix.block < p, q > (i, j);

在Eigen中,索引从0开始。

这两个版本都可以用于固定大小和动态大小的矩阵和数组。这两个表达式在语义上是等价的。唯一的区别是,如果块大小很小,固定大小的版本通常会提供更快的代码,但需要在编译时知道这个大小。

下面的程序使用动态大小和固定大小的版本打印矩阵中几个块的值。

#include <Eigen/Dense>
#include <iostream>using namespace std;int main()
{Eigen::MatrixXf m(4,4);m <<  1, 2, 3, 4,5, 6, 7, 8,9,10,11,12,13,14,15,16;cout << "Block in the middle" << endl;cout << m.block<2,2>(1,1) << endl << endl;for (int i = 1; i <= 3; ++i){cout << "Block of size " << i << "x" << i << endl;cout << m.block(0,0,i,i) << endl << endl;}
}

输出

Block in the middle6  7
10 11Block of size 1x1
1Block of size 2x2
1 2
5 6Block of size 3x31  2  35  6  79 10 11

在上面的例子中,.block()函数被用作右值,也就是说,它只能作为只读。但是,块也可以用作左值,这意味着您可以对块进行赋值。

下面的示例说明了这一点。这个示例还演示了数组中的块,其工作原理与上面演示的矩阵中的块完全相同。

#include <Eigen/Dense>
#include <iostream>int main()
{Eigen::Array22f m;m << 1,2,3,4;Eigen::Array44f a = Eigen::Array44f::Constant(0.6);std::cout << "Here is the array a:\n" << a << "\n\n";a.block<2,2>(1,1) = m;std::cout << "Here is now a with m copied into its central 2x2 block:\n" << a << "\n\n";a.block(0,0,2,3) = a.block(2,1,2,3);std::cout << "Here is now a with bottom-right 2x3 block copied into top-left 2x3 block:\n" << a << "\n\n";
}

输出

Here is the array 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
0.6 0.6 0.6 0.6Here is now a with m copied into its central 2x2 block:
0.6 0.6 0.6 0.6
0.6   1   2 0.6
0.6   3   4 0.6
0.6 0.6 0.6 0.6Here is now a with bottom-right 2x3 block copied into top-left 2x3 block:3   4 0.6 0.6
0.6 0.6 0.6 0.6
0.6   3   4 0.6
0.6 0.6 0.6 0.6

虽然 .block()方法可用于任何块操作,但还有其他方法用于特殊情况,提供更专门的API和/或更好的性能。关于性能的话题,最重要的是在编译时向Eigen提供尽可能多的信息。例如,如果您的块是矩阵中的单个完整列,那么使用下面描述的专门的 .col() 函数可以让Eigen知道这一点,这可以为其提供优化机会。

本页的其余部分将描述这些专门的方法。

二、列和行

单独的列和行是块的特殊情况。Eigen提供了方便地解决这些问题的方法:.col()和.row()。

块操作方法
第 i 行*matrix.row( i );
第 j 列*matrix.col ( j );

col()和row()的参数是要访问的列或行的索引。在Eigen中,索引从0开始。

#include <Eigen/Dense>
#include <iostream>using namespace std;int main()
{Eigen::MatrixXf m(3,3);m << 1,2,3,4,5,6,7,8,9;cout << "Here is the matrix m:" << endl << m << endl;cout << "2nd Row: " << m.row(1) << endl;m.col(2) += 3 * m.col(0);cout << "After adding 3 times the first column into the third column, the matrix m is:\n";cout << m << endl;
}

输出

Here is the matrix m:
1 2 3
4 5 6
7 8 9
2nd Row: 4 5 6
After adding 3 times the first column into the third column, the matrix m is:1  2  64  5 187  8 30

该示例还演示了块表达式(这里是列)可以像任何其他表达式一样用于算术。

三、Corner-related操作

Eigen还为在矩阵或数组的一个角或边上刷新的块提供了特殊方法。例如,. topleftcorner()可用于引用矩阵左上角的块。

不同的可能性总结如下表:

块操作动态大小的块表达式固定大小块表达式
Top-left p by q block *matrix.topLeftCorner(p,q);matrix.topLeftCorner<p,q>();
Bottom-left p by q block *matrix.bottomLeftCorner(p,q);matrix.bottomLeftCorner<p,q>();
Top-right p by q block *matrix.topRightCorner(p,q);matrix.topRightCorner<p,q>();
Bottom-right p by q block *matrix.bottomRightCorner(p,q);matrix.bottomRightCorner<p,q>();
Block containing the first q rows *matrix.topRows(q);matrix.topRows<q>();
Block containing the last q rows *matrix.bottomRows( q );matrix.bottomRows<q>();
Block containing the first p columns *matrix.leftCols( p );matrix.leftCols<p>();
Block containing the last q columns *matrix.rightCols(q);matrix.rightCols<q>();
Block containing the q columns starting from i *matrix.middleCols(i,q);matrix.middleCols<q>(i);
Block containing the q rows starting from i *matrix.middleRows(i,q);matrix.middleRows<q>(i);

下面是一个简单的例子,说明上述操作的用法:

#include <Eigen/Dense>
#include <iostream>using namespace std;int main()
{Eigen::Matrix4f m;m << 1, 2, 3, 4,5, 6, 7, 8,9, 10,11,12,13,14,15,16;cout << "m.leftCols(2) =" << endl << m.leftCols(2) << endl << endl;cout << "m.bottomRows<2>() =" << endl << m.bottomRows<2>() << endl << endl;m.topLeftCorner(1,3) = m.bottomRightCorner(3,1).transpose();cout << "After assignment, m = " << endl << m << endl;

输出

m.leftCols(2) =1  25  69 10
13 14m.bottomRows<2>() =9 10 11 12
13 14 15 16After assignment, m = 8 12 16  45  6  7  89 10 11 12
13 14 15 16

四、向量的块运算

Eigen还提供了一组专门为向量和一维数组的特殊情况设计的块操作:

块操作动态大小的块表达式固定大小块表达式
包含前n个元素的块*vector.head (n);vector.head < n > ();
包含最后n个元素的块*vector.tail (n);vector.tail < n > ();
包含n个元素的块,从位置i *开始vector.segment (n);vector.segment < n >(i);

下面是一个例子:

#include <Eigen/Dense>
#include <iostream>using namespace std;int main()
{Eigen::ArrayXf v(6);v << 1, 2, 3, 4, 5, 6;cout << "v.head(3) =" << endl << v.head(3) << endl << endl;cout << "v.tail<3>() = " << endl << v.tail<3>() << endl << endl;v.segment(1,4) *= 2;cout << "after 'v.segment(1,4) *= 2', v =" << endl << v << endl;
}

输出

v.head(3) =
1
2
3v.tail<3>() = 
4
5
6after 'v.segment(1,4) *= 2', v =1468
106

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

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

相关文章

什么是VR紧急情况模拟|消防应急虚拟展馆|VR游戏体验馆加盟

VR紧急情况模拟是利用虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;技术来模拟各种紧急情况和应急场景的训练和演练。通过VR技术&#xff0c;用户可以身临其境地体验各种紧急情况&#xff0c;如火灾、地震、交通事故等&#xff0c;以及应对这些紧急情况的…

贪心算法(算法竞赛、蓝桥杯)--修理牛棚

1、B站视频链接&#xff1a;A27 贪心算法 P1209 [USACO1.3] 修理牛棚_哔哩哔哩_bilibili 题目链接&#xff1a;[USACO1.3] 修理牛棚 Barn Repair - 洛谷 #include <bits/stdc.h> using namespace std; const int N205; int m,s,c,ans; int a[N];//牛的位置标号 int d[N…

奇怪的需求之与图片做交互

1.起因 客户想要展示自己的地图,该地图上有各种工作数据,和工作点位,已有的地图不能满足需求.于是提出将这张图片当成大背景 2.经过 鉴于文件格式和尺寸的原因,协商后客户提出将图片做成缩放效果,同时具有点击效果,原先直接进入的主页,现在为点击图片中的某条线路进入主页面…

Ubuntu tesseract使用全是干货

文字检测 方案 利用opencv二值化处理。最后检测使用google的开源库libtesseract识别文字。 tesseract安装 apt install libtesseract-dev # 前面那个是英文&#xff0c;后面那个是中文 apt install tesseract-oct tesseract-ocr-chi-sim手册 手册 qt creator中使用 pro文…

[LeetCode]143.重排链表

143. 重排链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/reorder-list/description/ 题目 示例 解题思路 寻找链表中点 链表逆序 合并链表 注意到目标链表即为将原链表的左半端和反转后的右半端合并后的结果。 这样我们的任务即可划分为三步&a…

Redis 8种基本数据类型及常用命令和数据类型的应用场景

小伙伴们好&#xff0c;欢迎关注&#xff0c;一起学习&#xff0c;无限进步 文章内容为学习的一些笔记及工作中遇到的一些问题 文章目录 Redis 五大数据类型keyStringListSetHashSorted Set 三种特殊类型Geospatial 地理位置HyperloglogBitmap Redis 五大数据类型 redis 官方网…

Python中的os库

一.OS库简介 OS是Operating System的简写&#xff0c;即操作系统。 OS库是一个操作系统接口模块&#xff0c;提供一些方便使用操作系统相关功能的函数。 二.OS库常用函数 2.1文件和目录 2.1.1&#xff1a;os.getcwd() 作用&#xff1a;返回当前工作目录&#xff0c;结果是…

Python中re(正则)模块的使用

re 是 Python 标准库中的一个模块&#xff0c;用于支持正则表达式操作。通过 re 模块&#xff0c;可以使用各种正则表达式来搜索、匹配和操作字符串数据。 使用 re 模块可以帮助在处理字符串时进行高效的搜索和替换操作&#xff0c;特别适用于需要处理文本数据的情况。 # 导入…

怎样把python字符串中的emoji表情包去掉或忽略?

要从Python字符串中去掉或忽略表情符号&#xff0c;可以使用正则表达式来过滤掉所有的Unicode码点大于\uFFFF的字符。这些字符通常是表情符号。 以下是一个示例代码&#xff1a; import redef remove_emojis(text):emoji_pattern re.compile("["u"\U0001F600…

如何在Window系统部署BUG管理软件并结合内网穿透实现远程管理本地BUG

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

微信小程序开启横屏调试

我们先打开小程序项目 开启真机运行 目前是一个竖屏的 然后打开全局配置文件 app.json 给下面的 window 对象 下面加一个 pageOrientation 属性 值为 landscape 运行结果如下 然后 我们开启真机运行 此时 就变成了个横屏的效果

Android、ios 打包一键生成自定义尺寸应用图标

这里以uniapp 打包为例 这里是打包时分别需要使用的尺寸 打开一键生成应用图标 在线工具 一键生成应用图标https://icon.wuruihong.com/ 上传你的应用图标 上传后在这里添加你需要用到的尺寸 开始生成 下载你批量生成的图标

使用Python,networkx绘制有向层级结构图

使用Python&#xff0c;networkx绘制有向层级结构图 1. 效果图2. 源码2.1 tree.txt2.2 pyNetworkx.py参考 上一篇介绍了&#xff1a;1. 使用Python&#xff0c;networkx对卡勒德胡赛尼三部曲之《群山回唱》人物关系图谱绘制 当前博客介绍&#xff1a; 2. 使用Python&#xff0c…

11408

果然很terrible

仿牛客网项目---社区首页的开发实现

从今天开始我们来写一个新项目&#xff0c;这个项目是一个完整的校园论坛的项目。主要功能模块&#xff1a;用户登录注册&#xff0c;帖子发布和热帖排行&#xff0c;点赞关注&#xff0c;发送私信&#xff0c;消息通知&#xff0c;社区搜索等。这篇文章我们先试着写一下用户的…

剑指offer面试题21 包含min函数的栈

考察点 双栈知识点 题目 分析 题目需要一个能够得到栈的最小元素的min函数&#xff0c;并且min函数&#xff0c;pop&#xff0c;push都要求是O(1)的时间复杂度。遇到栈思维要往双栈上考虑&#xff0c;这种情况一个栈肯定完成不了&#xff0c;需要一个辅助栈&#xff0c;既然…

个人玩航拍,如何申请无人机空域?

我们在《年会不能停》一文中&#xff0c;有分享我们在西岭雪山用无人机拍摄的照片和视频&#xff0c;有兴趣可以去回顾。 春节的时候&#xff0c;趁着回老家一趟&#xff0c;又将无人机带了回去&#xff0c;计划拍一下老家的风景。 原本以为穷乡僻壤的地方可以随便飞&#xf…

Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析

3. SpringBoot原理 SpringBoot使我们能够集中精力地去关注业务功能的开发&#xff0c;而不用过多地关注框架本身的配置使用。而我们前面所讲解的都是面向应用层面的技术&#xff0c;接下来我们开始学习SpringBoot的原理&#xff0c;这部分内容偏向于底层的原理分析。 在剖析Sp…

华为OD技术面试案例4-2024年

个人情况&#xff1a;985本&#xff0c;目标院校非计算机专业&#xff0c;情况比较特殊&#xff0c;23年11月研究生退学&#xff0c;电子信息类专业。 初识od&#xff1a;10月底打算退学的时候在智联、BOSS上疯狂投硬件方面的岗位。投了大概一两天后有德科和HW的HR打电话给我介…

Go开发 入门以VSCode为例

一、Go环境搭建 1.1 安装 进入Golang官网 https://go.dev&#xff0c;点击 Download 若无法打开网页可以使用国内的Go语言中文网 https://studygolang.com/dl 进入下载 找到合适的平台点击链接下载即可&#xff08;这里以Windows距离&#xff09; 下载完成后 Next Next 安…