第 25 章 · 索引与块操作
学会读写矩阵里的元素和子矩阵。这是使用 Eigen 的基本功几乎每个程序都会用到。25.1 读写单个元素m(i, j)用圆括号不是方括号读写元素Eigen::Matrix3d m;m1,2,3,4,5,6,7,8,9;std::coutm(0,0)std::endl;// 1第 1 行第 1 列std::coutm(1,2)std::endl;// 6第 2 行第 3 列m(0,0)100;// 修改元素⚠ 索引从 0 开始m(0,0)是第一个元素不是m(1,1)。这是数学从 1 开始和代码从 0 开始的差异新手最常在这里出错。向量用单个下标v(i)等价于v(i, 0)Eigen::Vector3dv(1,2,3);std::coutv(0)std::endl;// 1std::coutv(2)std::endl;// 325.2 索引类型 Eigen::Index循环里用int做下标在小矩阵没问题但大矩阵可能溢出。Eigen 提供了Eigen::Index通常是 64 位整数更安全Eigen::MatrixXdm(1000,1000);for(Eigen::Index i0;im.rows();i){for(Eigen::Index j0;jm.cols();j){m(i,j)0;}}初学用int也行但养成用Eigen::Index的习惯更好。25.3 取整行 / 整列Eigen::MatrixXdm(4,4);m1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;std::cout第 2 行m.row(1)std::endl;// 5 6 7 8std::cout第 3 列\nm.col(2)std::endl;// 3 7 11 15m.row(i)第 i 行m.col(j)第 j 列25.4 取子矩阵blockblock(i, j, p, q)从第 i 行第 j 列开始取 p 行 q 列的子矩阵。// 从 (1,1) 开始取 2 行 3 列std::coutm.block(1,1,2,3)std::endl;// 输出// 6 7 8// 10 11 1225.5 取四角cornerm.topLeftCorner(2,2);// 左上角 2x2m.topRightCorner(2,2);// 右上角m.bottomLeftCorner(2,2);// 左下角m.bottomRightCorner(2,2);// 右下角25.6 向量的片段segment / head / tailEigen::VectorXd vEigen::VectorXd::LinSpaced(10,0,9);// 0~9v.segment(3,4);// 从下标 3 开始取 4 个3 4 5 6v.head(3);// 前 3 个0 1 2v.tail(3);// 后 3 个7 8 925.7 块是视图改块会改原矩阵关键概念block、row、col等返回的是视图引用不是副本修改视图会直接改原矩阵。Eigen::Matrix3d aEigen::Matrix3d::Zero();a.block(0,0,2,2).setOnes();// 把左上角 2x2 改成全 1// 现在 a 变成// 1 1 0// 1 1 0// 0 0 0这非常有用——你可以直接操作子矩阵改动会反映到原矩阵。这也带来别名风险第 34 章详解视图和原矩阵共用内存让一次赋值边读边写就会算错。举个实测的例子Eigen 5.0 g 16.1Eigen::Matrix3d a;a1,2,3,4,5,6,7,8,9;a.block(0,0,2,2)a.block(0,0,2,2).transpose();// 左上角 2x2 原地转置左上角 2×2 原本是1 2 / 4 5转置后应为1 4 / 2 5。实测Debug 直接断言中止提示aliasing detected during transposition, use transposeInPlace()而Release-DNDEBUG不报错输出错的1 2 / 2 5。正确写法是a.block(0,0,2,2) a.block(0,0,2,2).transpose().eval();实测得到正确的1 4 / 2 5或者先把转置存进一个临时变量再写回。25.8 遍历矩阵Eigen::MatrixXdm(3,4);m.setRandom();doublesum0;for(Eigen::Index i0;im.rows();i){for(Eigen::Index j0;jm.cols();j){summ(i,j);}}实际上Eigen 提供了m.sum()第 28 章等内置归约一般不需要手写循环。但了解怎么遍历是基本功。25.9 本章完整示例把本章的操作串成一个程序存成ch25.cpp按附录 C.3 编译#includeEigen/Dense#includeiostreamintmain(){Eigen::MatrixXdm(4,4);m1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;std::coutm(1,2) m(1,2)\n;// 第 2 行第 3 列std::cout第 2 行m.row(1)\n;std::cout第 3 列\nm.col(2)\n;std::coutblock(1,1,2,3):\nm.block(1,1,2,3)\n;std::cout左上角 2x2:\nm.topLeftCorner(2,2)\n;Eigen::VectorXd vEigen::VectorXd::LinSpaced(10,0,9);// 0~9std::coutsegment(3,4) v.segment(3,4).transpose()\n;std::couthead(3) v.head(3).transpose()\n;std::couttail(3) v.tail(3).transpose()\n;// 块是视图改视图就是改原矩阵Eigen::Matrix3d aEigen::Matrix3d::Zero();a.block(0,0,2,2).setOnes();std::cout改完左上角 2x2 之后 a \na\n;// 手写遍历求和doublesum0;for(Eigen::Index i0;im.rows();i){for(Eigen::Index j0;jm.cols();j){summ(i,j);}}std::cout遍历求和 sum内置 m.sum() m.sum()\n;return0;}运行结果m(1,2) 7 第 2 行5 6 7 8 第 3 列 3 7 11 15 block(1,1,2,3): 6 7 8 10 11 12 左上角 2x2: 1 2 5 6 segment(3,4) 3 4 5 6 head(3) 0 1 2 tail(3) 7 8 9 改完左上角 2x2 之后 a 1 1 0 1 1 0 0 0 0 遍历求和 136内置 m.sum() 136自己核对一下m(1,2) 7第 2 行、第 3 列的那个元素正是 7。25.10 小结m(i,j)读写元素从 0 开始向量v(i)。row(i)、col(j)取行列block(i,j,p,q)取子矩阵。topLeftCorner等取角segment/head/tail取向量的片段。块操作返回视图修改会反映到原矩阵。下一章学习算术运算——加减乘、点积叉积、转置。练习题创建 3×3 矩阵打印m(0,0)和m(2,2)。用m.row(1)打印第 2 行m.col(0)打印第 1 列。用block取出中间 2×2 子矩阵并打印。用head、tail、segment操作一个长度为 10 的向量。验证用block().setOnes()修改子矩阵观察原矩阵是否变化。

相关新闻

自养Agent日志:8 组臂实测:6 种 stdout 污染,4 种完全静默、2 种报错却都指错方向

自养Agent日志:8 组臂实测:6 种 stdout 污染,4 种完全静默、2 种报错却都指错方向

我是自养Agent,这是生存游戏的第 26 天。 难题 #11|静默税:stdout 上多打一个 print,server 就死了 你能从这篇拿走的四条 一份能复现的污染清单:6 种 stdout 污染方式 8 组臂的实测结果,代码加起来不到…

2026/10/9 14:09:16 阅读更多 →
简单文法编译器前端实战:从文法设计到AST构建全流程拆解

简单文法编译器前端实战:从文法设计到AST构建全流程拆解

简介:编译原理课程设计完整报告,面向编译原理课程设计与系统软件入门学习者,系统解决从词法分析、语法语义分析到中间代码生成的全流程实现问题。报告采用递归下降子程序法,在解析变量声明、算术运算与赋值语句基础上,…

2026/10/9 14:09:15 阅读更多 →
OceanBase应用开发避坑指南:从MySQL迁移必懂的分区、索引与事务

OceanBase应用开发避坑指南:从MySQL迁移必懂的分区、索引与事务

简介:这份学习资料围绕OceanBase数据库应用开发基础展开,面向使用或准备使用OceanBase的开发者、DBA及后端工程师,帮助读者快速建立从SQL操作、索引设计到分布式事务与并发控制的核心认知。内容系统覆盖OceanBase基础架构、标准SQL用法、B-tr…

2026/10/9 14:09:15 阅读更多 →

最新新闻

基于Hadoop的好友推荐系统设计与MapReduce实现

基于Hadoop的好友推荐系统设计与MapReduce实现

简介:基于Hadoop实现的好友推荐系统毕业设计资源,包含可调试运行的Java源码和完整文档说明。项目围绕Hadoop平台设计好友推荐核心逻辑,覆盖数据读取、距离计算、聚类分析、推荐生成等环节,并包含距离计算、聚类、画图等模块&#…

2026/10/9 14:39:07 阅读更多 →
自适应滑模控制Matlab仿真:非线性系统参数不确定下的控制器设计

自适应滑模控制Matlab仿真:非线性系统参数不确定下的控制器设计

自适应滑模控制这几年在控制领域出镜率非常高,尤其是做非线性系统控制、机器人、无人机、电力电子这些方向的,基本绕不开。做控制的都知道,真实系统很难拿到精确数学模型,参数不确定、外部扰动、未建模动态堆在一起,固…

2026/10/9 14:39:07 阅读更多 →
基于线性回归的PM2.5预测实战:从数据预处理到模型评估

基于线性回归的PM2.5预测实战:从数据预处理到模型评估

简介:这是一份面向机器学习初学者的Python课程大作业源码包,选择合肥地区过去一年的PM2.5月度数据作为样本,完整实现基于线性回归的空气质量预测。项目不仅包含数据读取与清洗、梯度下降公式推导与代码实现、矩阵模型构建,还提供了…

2026/10/9 14:39:07 阅读更多 →
机器学习天气预测源码解析:数据清洗、特征工程到可视化

机器学习天气预测源码解析:数据清洗、特征工程到可视化

简介:基于Python的机器学习天气预测与数据可视化完整源码,属于Python期末大作业与课程设计类资源,适合计算机相关专业正在完成大作业、毕业设计或需要实战练习的学习者。项目经导师指导并认可,评审得分98分,源码均经本…

2026/10/9 14:39:07 阅读更多 →
特种机器人教学PPT:工程参数驱动的课堂交付物

特种机器人教学PPT:工程参数驱动的课堂交付物

简介:本资源是一份面向高校机器人工程、自动化、人工智能等相关专业师生的《特种机器人介绍》精品课件,系统讲解特种机器人的核心知识体系与前沿应用。课件内容覆盖四大模块:分类与典型应用场景(服务、医疗、水下、农林业、娱乐机…

2026/10/9 14:39:06 阅读更多 →
DeepLabV3实战:Cityscapes标签转trainId与训练迁移全指南

DeepLabV3实战:Cityscapes标签转trainId与训练迁移全指南

简介:面向计算机视觉语义分割研究者的PyTorch实现,基于Cityscapes数据集训练DeepLabV3,解决街景场景中物体边缘模糊与多尺度特征提取问题。压缩包共18个文件,约258MB,其中12个py脚本覆盖模型结构定义、数据预处理、Dat…

2026/10/9 14:38:05 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →