第 33 章 · 稀疏矩阵
现实中的大矩阵往往大部分元素是 0比如社交网络、物理仿真。存一堆 0 太浪费稀疏矩阵只存非零元素省内存、算得快。本章讲怎么构建和使用稀疏矩阵。33.1 为什么需要稀疏矩阵一个 1000×1000 的稠密矩阵要存 100 万个元素约 8 MB。但如果它只有 1000 个非零元素其余都是 0稠密存储就浪费了 99.9% 的空间。稀疏矩阵只存非零元素能把内存和计算量降几个数量级。稠密MatrixXd稀疏SparseMatrix存储所有元素只存非零元素适用大部分非零大部分是 0非零 ~10%大小适合小矩阵适合超大稀疏矩阵33.2 用 Triplet 构建稀疏矩阵稀疏矩阵不能像稠密那样填值要用三元组Triplet(行, 列, 值)的列表。#includeEigen/Sparse#includeiostream#includevectorintmain(){// 1. 收集三元组 (行, 列, 值)std::vectorEigen::Tripletdoubletriplets;triplets.push_back({0,0,1.0});triplets.push_back({0,1,0.5});triplets.push_back({1,1,2.0});triplets.push_back({2,2,3.0});triplets.push_back({2,4,0.3});triplets.push_back({3,3,4.0});triplets.push_back({4,4,5.0});// 2. 创建 5x5 稀疏矩阵填入三元组Eigen::SparseMatrixdoubleS(5,5);S.setFromTriplets(triplets.begin(),triplets.end());// 3. 转成稠密矩阵打印std::coutEigen::MatrixXd(S)std::endl;std::cout非零元素个数 S.nonZeros()std::endl;// 7return0;}运行结果1 0.5 0 0 0 0 2 0 0 0 0 0 3 0 0.3 0 0 0 4 0 0 0 0 0 5 非零元素个数 7要点Eigen::Tripletdouble(行, 列, 值)描述一个非零元素S.setFromTriplets(begin, end)批量填入用Eigen::MatrixXd(S)转成稠密矩阵查看33.3 稀疏矩阵的基本操作S.rows();S.cols();// 尺寸S.nonZeros();// 非零元素个数S.coeff(i,j);// 读元素慢别在循环里频繁用S.insert(i,j)value;// 插入单个元素稀疏矩阵读单个元素用coeff()不是()且遍历效率低尽量用三元组批量构建。33.4 用稀疏求解器解方程稀疏矩阵配合稀疏求解器能高效解大规模方程组#includeEigen/Sparse#includeiostream#includevectorintmain(){constintn5;// 构建稀疏矩阵主对角线 2上下对角线 -1对称正定std::vectorEigen::Tripletdoubletriplets;for(inti0;in;i){triplets.push_back({i,i,2.0});// 主对角线if(i1n){triplets.push_back({i1,i,-1.0});// 下对角线triplets.push_back({i,i1,-1.0});// 上对角线保持对称}}Eigen::SparseMatrixdoubleS(n,n);S.setFromTriplets(triplets.begin(),triplets.end());Eigen::VectorXdb(n);b1.5,2,3.3,4,5;// 稀疏求解器SimplicialLDLT 适合对称正定Eigen::SimplicialLDLTEigen::SparseMatrixdoublesolver;solver.compute(S);if(solver.info()Eigen::Success){Eigen::VectorXd xsolver.solve(b);std::cout解 x.transpose()std::endl;std::cout残差 (S*x-b).norm()std::endl;}else{std::cout分解失败std::endl;}return0;}运行结果数值请以上面程序在你机器上的输出为准浮点末位可能有微小差异解 6.4 11.3 14.2 13.8 9.4 残差 2.66454e-15残差是 1e-15 量级也就是实际上等于 0——不要指望它打印成0浮点运算总会留下这种极小的尾巴第 29 章的残差同理。稀疏求解器有SimplicialLDLT/SimplicialLLT对称正定SparseLU一般方阵ConjugateGradient/BiCGSTAB迭代法超大矩阵33.5 稀疏 vs 稠密怎么选矩阵大部分是 0非零 ~10%且很大 → 稀疏 SparseMatrix 矩阵比较稠密或尺寸小 → 稠密 MatrixXd经验小矩阵几百以内用稠密就行几万×几万的稀疏矩阵才需要 SparseMatrix。稀疏矩阵有额外开销小矩阵用它反而慢。33.6 小结稀疏矩阵只存非零元素省内存、算得快。用Triplet行、列、值批量构建setFromTriplets填入。稀疏求解器SimplicialLDLT对称正定、SparseLU一般、迭代法超大。非零占比低 矩阵大才用稀疏。下一章学习性能优化与别名陷阱——避开 Eigen 最经典的坑。练习题用 Triplet 构建一个 3×3 的稀疏单位矩阵转成稠密打印。构建一个对角稀疏矩阵统计它的 nonZeros。用稀疏求解器解一个稀疏方程组。说说什么时候该用稀疏矩阵、什么时候用稠密矩阵。稀疏矩阵读单个元素用什么方法

相关新闻

【单片机课设毕设项目】基于单片机的物联网型厨房空气安全参数远程监控与预警系统设计 基于单片机的可燃气体泄漏远程文字告警与自动风扇控制装置设计(030119)

【单片机课设毕设项目】基于单片机的物联网型厨房空气安全参数远程监控与预警系统设计 基于单片机的可燃气体泄漏远程文字告警与自动风扇控制装置设计(030119)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/10/10 2:59:08 阅读更多 →
从1969到2026:苏净集团在100℃高温热泵赛道的技术深耕与行业实践

从1969到2026:苏净集团在100℃高温热泵赛道的技术深耕与行业实践

编者按:双碳目标背景下,工业节能需求持续增长,100℃高温热泵作为清洁高效的供热解决方案,得到了越来越多行业的关注。本文将梳理当前主流的100℃高温热泵生产厂家,重点介绍拥有半个多世纪技术沉淀的苏净集团在该领域的…

2026/10/10 2:59:08 阅读更多 →
从军工底蕴到节能先锋:苏净集团57年深耕,引领120℃高温热泵技术创新

从军工底蕴到节能先锋:苏净集团57年深耕,引领120℃高温热泵技术创新

在双碳目标推动下,工业领域对高温节能供热需求持续增长,120℃高温热泵凭借其高效节能、环保安全的特性,逐渐取代传统锅炉供热,成为工业节能改造的核心技术方向。当前国内市场中,深耕高温热泵领域的厂家众多&#xff0c…

2026/10/10 2:59:08 阅读更多 →

最新新闻

机器学习租房信息分析系统实战:从数据清洗到Django部署全流程

机器学习租房信息分析系统实战:从数据清洗到Django部署全流程

1. 为什么我会盯上这个"租房信息分析系统"项目前两周帮同学调试课程设计,题目正好是"基于机器学习的租房信息分析系统",技术栈锁定Python MySQL Django,交付物包括完整源文件、万字报告和讲解演示。这个题目乍看像是常…

2026/10/10 3:49:27 阅读更多 →
MySQL锁表排查与解锁实操:快速定位阻塞事务,告别Lock wait timeout

MySQL锁表排查与解锁实操:快速定位阻塞事务,告别Lock wait timeout

数据库出问题的时候,最能让人血压飙升的场景之一是表被锁住了。你在业务后台点了一下查询,页面转圈半天不返回;去命令行敲SQL,等了几分钟才报错,要么是“Lock wait timeout exceeded”,要么是“Deadlock fo…

2026/10/10 3:49:27 阅读更多 →
深度学习新冠疫情预测实战:从数据清洗到LSTM时间泄漏避坑

深度学习新冠疫情预测实战:从数据清洗到LSTM时间泄漏避坑

最近接到一个有点特殊的小任务:用深度学习做新冠人数预测。乍一听很像那种“拿个时间序列套个LSTM”的入门项目,真做起来才发现,这活儿比想象中要脏、要细、要磨人。从数据清洗、特征构造、模型选型到验证集设计,每一步都有不少坑…

2026/10/10 3:49:27 阅读更多 →
Python机器学习电商商品分析与预测实战指南

Python机器学习电商商品分析与预测实战指南

如果你也正在为“基于python机器学习的电商商品分析与预测”这类题目发愁——要求提交设计源文件、万字报告,还要当面讲解——那这篇内容就是写给你的。这个题目听起来唬人,拆开其实只有两件事:用 python 把电商商品数据里隐藏的规律挖出来&a…

2026/10/10 3:49:27 阅读更多 →
查询每个用户最新一条记录?SQL分组取最大行的5种写法与避坑指南

查询每个用户最新一条记录?SQL分组取最大行的5种写法与避坑指南

先别急着抄 SQL,这类“查询同一用户最新的一条交易记录”的需求,我几乎每隔一阵子就会在报表、对账、风控、消息推送的代码里碰到一遍。它看起来就一句话,写起来却五花八门,翻车的方式更是千奇百怪:要么同一个用户返回…

2026/10/10 3:49:27 阅读更多 →
MATLAB联合CST建模:超表面仿真自动化工作流实战

MATLAB联合CST建模:超表面仿真自动化工作流实战

最近不少做超表面的同学都在折腾CST仿真,尤其是想把MATLAB联合CST建模这条路彻底走通,用来处理超透镜、轨道角动量、吸收器、极化转换器、EIT(类电磁诱导透明)这些常见方向。这篇文章不打算讲教科书推导,只写我在真实仿…

2026/10/10 3:48:27 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

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/10 1:36:08 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →