Eigen稀疏矩阵类 (SparseMatrix)

1. SparseMatrix 核心属性与初始化

模板参数

cpp

SparseMatrix<Scalar, Options, StorageIndex>
  • Scalar:数据类型(如 doublefloat)。

  • Options:存储格式(默认 ColMajor,可选 RowMajor)。

  • StorageIndex:索引类型(通常为 int)。

关键属性
属性说明示例
rows()矩阵行数int rows = mat.rows();
cols()矩阵列数int cols = mat.cols();
nonZeros()非零元素数量int nnz = mat.nonZeros();
isCompressed()是否为压缩格式(CRS/CCS)bool compressed = mat.isCompressed();
初始化方式
方法示例说明
直接构造SparseMatrix<double> mat(100, 100);空矩阵(100x100)
三重态列表(Triplet)见下文逐元素填充
从稠密矩阵转换SparseMatrix<double> sp = dense.sparseView();自动过滤零值

2. 核心方法

(1) 元素插入与访问
方法参数说明功能示例
insert(i, j, value)i: 行索引,j: 列索引,value: 值插入非零元素(若存在则覆盖)mat.insert(0, 1) = 3.14;
coeffRef(i, j)同上访问/修改元素(若不存在则插入)mat.coeffRef(1, 2) += 1.0;
makeCompressed()压缩存储(CRS/CCS格式)mat.makeCompressed();(此后无法插入新元素)
valuePtr()innerIndexPtr()outerIndexPtr()获取压缩格式的底层数组指针用于直接操作底层数据(高级用法)
(2) 矩阵操作
方法参数说明功能示例
reserve(Size)Size: 预估非零元素数预分配内存mat.reserve(1000);
prune(Scalar, RealScalar)阈值和参考值删除绝对值小于阈值的元素mat.prune(1e-5, 0.0);
transpose()返回转置矩阵(视图)SparseMatrix<double> matT = mat.transpose();
sum()所有元素求和double total = mat.sum();
(3) 块操作与迭代
方法参数说明功能示例
block(startRow, startCol, rows, cols)起始位置和块大小返回子矩阵(视图)auto submat = mat.block(10, 10, 5, 5);
innerVector(outer)outer: 列号(ColMajor)返回列/行向量(视图)SparseVector<double> col = mat.innerVector(0);
迭代器(InnerIterator遍历非零元素见下方代码示例

3. 辅助类:Triplet

用于高效构建稀疏矩阵(先收集非零元素,再一次性填充):

cpp

#include <Eigen/SparseCore>
using namespace Eigen;std::vector<Triplet<double>> triplets;
triplets.push_back(Triplet<double>(0, 1, 3.0));  // (i, j, value)
triplets.push_back(Triplet<double>(1, 2, 4.0));SparseMatrix<double> mat(3, 3);
mat.setFromTriplets(triplets.begin(), triplets.end());

4. 稀疏矩阵分解与求解

求解器类
类名适用场景关键方法
SimplicialLLT对称正定矩阵compute(mat) + solve(b)
SparseLU通用方阵analyzePattern() + factorize()
ConjugateGradient对称正定矩阵(迭代法)setTolerance() + compute()
求解示例

cpp

SparseMatrix<double> A;
VectorXd b, x;// 使用 SimplicialLLT 分解
SimplicialLLT<SparseMatrix<double>> solver;
solver.compute(A);
if (solver.info() == Success) {x = solver.solve(b);
}// 使用迭代法(如共轭梯度)
ConjugateGradient<SparseMatrix<double>> cg;
cg.setTolerance(1e-6);
cg.compute(A);
x = cg.solve(b);

5. 代码示例

遍历非零元素

cpp

for (int k = 0; k < mat.outerSize(); ++k) {for (SparseMatrix<double>::InnerIterator it(mat, k); it; ++it) {std::cout << "(" << it.row() << "," << it.col() << ") = " << it.value() << std::endl;}
}
矩阵运算

cpp

SparseMatrix<double> A, B;
A.resize(100, 100);
B.resize(100, 100);
// ... 填充 A 和 B ...// 稀疏矩阵加法
SparseMatrix<double> C = A + B;// 稀疏矩阵乘法
SparseMatrix<double> D = A * B;// 标量乘法
SparseMatrix<double> E = 2.5 * A;

6. 性能优化技巧

  1. 预分配内存:通过 reserve() 或 Triplet 避免多次扩容。

  2. 压缩存储:操作完成后调用 makeCompressed() 提升计算效率。

  3. 选择合适的求解器

    • 对称正定矩阵:优先用 SimplicialLLT 或 ConjugateGradient

    • 非对称矩阵:使用 SparseLU 或 BiCGSTAB

7. 常见问题

  • 插入效率:未压缩模式下插入更快,但计算前需压缩。

  • 内存占用:稀疏矩阵内存 ≈ (2 * nnz + cols + 1) * sizeof(Index) + nnz * sizeof(Scalar)

掌握这些方法后,可高效处理大规模稀疏线性代数问题!更多细节见 Eigen SparseMatrix 文档。

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

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

相关文章

如何监控和分析MySQL数据库的性能?

文章目录 前言1.环境配置2. 使用 MySQL 自带工具SHOW STATUS 命令SHOW PROCESSLIST 命令EXPLAIN 命令 3. 开启慢查询日志操作步骤 4. 使用第三方监控工具MySQL Enterprise MonitorPercona ToolkitNagiosZabbix 5. 分析系统资源使用情况工具及方法 前言 要监控和分析 MySQL 数据…

高中数学联赛模拟试题精选第17套几何题

在四边形 A B C D ABCD ABCD 中, A B A D AB AD ABAD, B C ⊥ A B BC \perp AB BC⊥AB, ∠ D C B \angle DCB ∠DCB 的平分线与 A B AB AB 交于 E E E, 过点 A A A 且垂直于 C D CD CD 的直线与 D E DE DE 交于 F F F, M M M 是 B D BD BD 的中点. 求证: F M ∥…

ZYNQ笔记(十三):双核 AMP 通信实验

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; ZYNQ 裸机双核 AMP 实验&#xff1a; CPU0 接收串口的数据&#xff0c;并写入 OCM 中&#xff0c;然后利用软件产生中断触发 CPU1&#xff1b;CPU1 接收到中断后&#xff0c;根据从 OCM 中读出的数据控制呼吸灯的频…

桌面端开发技术栈选型:开启高效开发之旅

在数字化浪潮中&#xff0c;桌面端应用依然占据重要地位&#xff0c;而选择合适的技术栈是打造优质桌面端应用的关键一步。以下是多种主流桌面端开发技术栈的介绍与对比&#xff0c;希望能为大家提供有价值的参考。 基于 Web 技术的跨平台框架 • Electron&#xff1a; • 特…

C++ 的 输入输出流(I/O Streams)

什么是输入输出流 C 的输入输出操作是通过 流&#xff08;stream&#xff09; 机制实现的。 流——就是数据的流动通道&#xff0c;比如&#xff1a; 输入流&#xff1a;从设备&#xff08;如键盘、文件&#xff09;读取数据 → 程序 输出流&#xff1a;程序将数据写入设备&…

软件测评中心如何保障软件质量与安全性?

软件测评中心是一个专注于保障软件质量、稳定性和安全性的专业机构。在整个软件的生命周期中&#xff0c;它扮演着极其关键的角色。它运用科学的方法和严格的准则&#xff0c;对软件进行全面而细致的检测和评估&#xff0c;确保用户获得可靠的保障。 测评核心工作 软件测评中…

论人际关系发展的阶段

朋友关系的建立和发展是一个渐进的过程&#xff0c;通常需要经历情感积累、信任磨合和价值观融合等阶段。以下是朋友关系发展的详细阶段划分及核心特征&#xff1a; 一、表层接触阶段&#xff08;社交试探期&#xff09; 核心特征&#xff1a;以信息交换为主&#xff0c;关系停…

网络IP冲突的成因与解决方案

网络IP冲突的成因与解决方案 一、IP冲突的常见现象与危害二、IP冲突的常见原因三、6种实用解决方案四、预防IP冲突的4个最佳实践五、总结 前言 肝文不易&#xff0c;点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有惊喜。 作者&#xff1a;神的孩子…

前端节流、防抖函数

节流 什么是节流&#xff1f; 节流就是同一个事件 一秒钟他执行了很多次。但是我不想他执行这么多次&#xff0c;我只想让他执行一次 或者两次。 那该怎么办&#xff1f; why baby why 那我想就是他执行的时候 我就设置一个定时器&#xff0c;如果定时器是空的&#xff0c;等会…

LeetCode第171题_Excel表列序号

LeetCode 第171题&#xff1a;Excel表列序号 题目描述 给你一个字符串 columnTitle&#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...难度 简单 题目链…

基于YOLO与PySide6的道路缺陷检测系统(源码)

道路基础设施的健康状况直接影响交通安全与城市运营效率。传统人工巡检方式存在效率低、覆盖范围有限等问题,而基于深度学习的自动化检测技术为道路缺陷识别提供了创新解决方案。本文介绍一个结合YOLO目标检测模型与PySide6图形界面的道路塌陷检测系统,实现了高效、可视化的缺…

04_jQuery

文章目录 一、jQuery介绍1.1、jQuery概述1.2、jQuery特点1.3 为什么要用jQuery 二、引入jQuery2.1、直接引入2.2、CDN引入 三、jQuery语法3.1、基本使用3.2、jQuery事件及常用事件方法3.3、jQuery选择器&#xff08;重点&#xff09;3.3.1、基本选择器3.3.2、层次选择器3.3.3、…

Adruino:传感器及步进电机

一、传感器* 1、温湿度传感器 DHT11它采用专用的数字采集技术和温湿度传感器技术&#xff0c;包括一个电阻式感湿元件和NTC测温元件&#xff0c;并与一个高性能的8位单片机连接。DATA端采用串行接口&#xff08;单线双向&#xff09;与微控制器进行同步和通信。 DHT11的供电电…

高中数学联赛模拟试题精选第18套几何题

在 △ A B C \triangle ABC △ABC 中, A B < A C AB< AC AB<AC, 点 K K K, L L L, M M M 分别是边 B C BC BC, C A C A CA, A B AB AB 的中点. △ A B C \triangle ABC △ABC 的内切圆圆心为 I I I, 且与边 B C BC BC 相切于点 D D D. 直线 l l l 经过线段…

ubantu18.04(Hadoop3.1.3)之Spark安装和编程实践

说明&#xff1a;本文图片较多&#xff0c;耐心等待加载。&#xff08;建议用电脑&#xff09; 注意所有打开的文件都要记得保存。 第一步&#xff1a;准备工作 本文是在之前Hadoop搭建完集群环境后继续进行的&#xff0c;因此需要读者完成我之前教程的所有操作。 以下所有操…

DCDC芯片,boost升压电路设计,MT3608 芯片深度解析:从架构到设计的全维度技术手册

一、硬件架构解析:电流模式升压 converter 的核心设计 (一)电路拓扑与核心组件 MT3608 采用恒定频率峰值电流模式升压(Boost)转换器架构,核心由以下模块构成: 集成功率 MOSFET 内置 80mΩ 导通电阻的 N 沟道 MOSFET,漏极(Drain)对应引脚 SW,源极(Source)内部接…

Java 日志:掌握本地与网络日志技术

日志记录是软件开发中不可或缺的一部分&#xff0c;它为开发者提供了洞察应用程序行为、诊断问题和监控性能的手段。在 Java 生态系统中&#xff0c;日志框架如 Java Util Logging (JUL)、Log4j 和 Simple Logging Facade for Java (SLF4J) 提供了丰富的功能。然而&#xff0c;…

上位机知识篇---时钟分频

文章目录 前言 前言 本文简单介绍了一下时钟分频。时钟分频&#xff08;Clock Division&#xff09;是数字电路设计中常见的技术&#xff0c;用于将高频时钟信号转换为较低频率的时钟信号&#xff0c;以满足不同模块的时序需求。它在处理器、FPGA、SoC&#xff08;片上系统&am…

推荐几个免费提取音视频文案的工具(SRT格式、通义千问、飞书妙记、VideoCaptioner、AsrTools)

文章目录 1. 前言2. SRT格式2.1 SRT 格式的特点2.2 SRT 文件的组成2.3 SRT 文件示例 3. 通义千问3.1 官网3.2 上传音视频文件3.3 导出文案 4. 飞书妙记4.1 官网4.2 上传音视频文件4.3 导出文案4.4 缺点 5. VideoCaptioner5.1 GitHub地址5.2 下载5.2.1 通过GitHub下载5.2.2 通过…

Linux深度探索:进程管理与系统架构

1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是由⼀个个的硬件组件组成。 输入设备&#xff1a;键盘&#xff0c;鼠标…