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

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 文档。

相关文章:

  • Centos7系统防火墙使用教程
  • 某东h5st_5.1(补环境)
  • qt/c++云对象浏览器
  • 文章记单词 | 第46篇(六级)
  • java函数式接口与方法引用
  • 八猴渲染器三维场景实时预览软件 Marmoset Toolbag 5.01 安装包免费下载
  • 山东大学离散数学第九章习题解析
  • C++ 为什么建议类模板定义在头文件中,而不定义在源文件中
  • Nacos详解
  • Python 第 12、13 节课 - 元组和列表
  • Linux基本指令(保姆级教学)
  • 【新技术】Testfy.js v3.0 深度解析与使用指南
  • 关于循环缓冲区
  • MUC基本知识
  • 基于javaweb的SpringBoot小说阅读系统设计与实现(源码+文档+部署讲解)
  • Threejs中顶视图截图
  • Python dotenv 使用指南:轻松管理项目环境变量
  • Bento4的安装和简单转码
  • Linux基础指令【上】
  • 写时拷贝讲解
  • 伊朗港口爆炸已致40人死亡
  • 合肥一季度GDP为3003.88亿元,同比增长6.6%
  • CSR周刊:李宁打造世界地球日特别活动,珀莱雅发布2024年度可持续发展报告
  • 清华数字政府与治理研究院揭牌:服务数字政府建设需求
  • 从地下金库到地上IP,看海昏汉文化“最美变装”
  • 罗马教皇方济各葬礼在梵蒂冈举行