当前位置: 首页 > web >正文

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.xdnf.cn/news/2272.html

相关文章:

  • VS2019 与gitcode团队管理
  • QT6 源(52)篇二:存储 c 语言字符串的类 QByteArray 的使用举例,
  • Git基本操作
  • 第34课 常用快捷操作——按“空格键”旋转图元
  • MySQL技术白皮书
  • 定位与解决线上 OOM 问题:原因分析与快速排查指南
  • o4 - mini 助力,OpenAI 向免费用户推出轻量版 Deep Research
  • CMake 中使用动态库时的 DLL 拷贝逻辑详解(以 zlib 为例)
  • 【BBDM】main.py -- notes
  • 传统智慧焕新,打造现代养生生活
  • X86物理机安装iStoreOS软路由
  • ShaderToy学习笔记 01.基础知识
  • C++学习:六个月从基础到就业——模板编程:函数模板
  • ARP协议【复习篇】
  • 从头训练小模型: 预训练(Pretrain)
  • 财务管理域——绩效管理系统设计
  • 某东h5st_5.1(补环境)
  • 119. 杨辉三角 II
  • C++模拟Java C#的 finally
  • 数据结构顺序表的实现
  • PyTorch作为深度学习框架在建筑行业的应用
  • 从基础到实践(三十三):USB接口简介
  • Python文件操作及数据库交互(Python File Manipulation and Database Interaction)
  • 【刷题Day27】Python/JAVA - 01(浅)
  • 状态压缩DP:蒙德里安的梦想
  • 极简桌面app官网版下载 极简桌面最新版 安装包下载
  • 导览项目KD-Tree最近地点搜索优化
  • Java集合复习题目
  • 【matlab】绘制maxENT模型的ROC曲线和omission curve
  • 基于 IPMI + Kickstart + Jenkins 的 OS 自动化安装