稀疏矩阵数据结构(如CSR、CSC格式)

稀疏矩阵数据结构

稀疏矩阵(Sparse Matrix)是一种大多数元素为零的矩阵。在处理稀疏矩阵时,如果我们直接使用常规的二维数组来存储矩阵数据,将会浪费大量的存储空间,因为大部分元素都是零。为了解决这一问题,稀疏矩阵数据结构应运而生,通过只存储非零元素来大幅减少内存消耗。

最常用的稀疏矩阵存储格式包括 压缩行存储(CSR)压缩列存储(CSC)。这两种格式是用于存储稀疏矩阵的标准方法。

1. 压缩行存储(CSR,Compressed Sparse Row)

CSR 是一种常用的稀疏矩阵存储方式,它将矩阵的非零元素按行存储,并记录每行中非零元素的位置。CSR格式通过三个数组来存储稀疏矩阵的数据:

  • values:存储矩阵中的所有非零元素。
  • column_indices:存储每个非零元素对应的列索引。
  • row_pointer:指示每行开始非零元素的位置。在这个数组中,元素 row_pointer[i] 表示第 i 行的第一个非零元素在 values 数组中的位置。

举个例子

假设我们有一个 4x5 的稀疏矩阵如下:

[
[00300 00040 50006 07000]
]

对于这个矩阵,使用CSR格式存储时,三个数组会是:

  • values:[3, 4, 5, 6, 7]
  • column_indices:[2, 3, 0, 4, 1]
  • row_pointer:[0, 1, 2, 4, 5]

说明

  • values 存储了矩阵中的非零元素。
  • column_indices 存储了每个非零元素对应的列索引。
  • row_pointer 存储了每行的起始非零元素在 values 数组中的位置。

这样,通过这三个数组,CSR格式可以高效地存储稀疏矩阵的数据并快速访问。

2. 压缩列存储(CSC,Compressed Sparse Column)

CSC 格式与CSR格式非常相似,只是它将矩阵的非零元素按列存储。CSC格式通过三个数组来存储稀疏矩阵的数据:

  • values:存储矩阵中的所有非零元素。
  • row_indices:存储每个非零元素对应的行索引。
  • column_pointer:指示每列开始非零元素的位置。在这个数组中,元素 column_pointer[j] 表示第 j 列的第一个非零元素在 values 数组中的位置。

举个例子

假设我们有一个 4x5 的稀疏矩阵如下:

[
[00300 00040 50006 07000]
]

对于这个矩阵,使用CSC格式存储时,三个数组会是:

  • values:[3, 5, 4, 6, 7]
  • row_indices:[0, 2, 1, 2, 3]
  • column_pointer:[0, 1, 2, 3, 5, 5]

说明

  • values 存储了矩阵中的非零元素。
  • row_indices 存储了每个非零元素对应的行索引。
  • column_pointer 存储了每列的起始非零元素在 values 数组中的位置。

3. CSR与CSC的对比

特性 CSR(压缩行存储) CSC(压缩列存储)
存储方式 按行存储非零元素 按列存储非零元素
使用数组数目 3个:valuescolumn_indicesrow_pointer 3个:valuesrow_indicescolumn_pointer
适用的操作 快速按行遍历、矩阵乘法、求解线性方程组等 快速按列遍历、矩阵乘法、求解线性方程组等
优势 对于按行访问较快(例如:矩阵-向量乘法) 对于按列访问较快(例如:矩阵-向量乘法)
适用场景 行操作为主的稀疏矩阵运算(如行扫描) 列操作为主的稀疏矩阵运算(如列扫描)

4. 其他稀疏矩阵格式

除了CSR和CSC格式外,还有一些其他的稀疏矩阵存储格式:

  • COO(Coordinate List)格式:通过三组数组来存储矩阵的行索引、列索引和非零值,适合于稀疏矩阵的插入操作。
  • DIA(Diagonal Storage)格式:适用于对角线矩阵,通过存储每一对角线上的非零元素来节省空间。
  • LIL(List of Lists)格式:每行的非零元素用链表存储,适用于稀疏矩阵的动态修改。

5. 稀疏矩阵操作

在稀疏矩阵中,常见的操作有:

  • 矩阵乘法:稀疏矩阵乘法可以利用稀疏矩阵的数据结构高效实现,只对非零元素进行运算。
  • 矩阵转置:稀疏矩阵的转置可以通过调整矩阵的行列索引来实现。
  • 求解线性方程组:稀疏矩阵经常用于求解线性方程组,通过专门的稀疏求解器(如CG、GMRES)可以高效地处理。

6. 总结

使用稀疏矩阵数据结构(如CSR、CSC格式)可以有效减少存储和计算开销,尤其是在处理大规模稀疏矩阵时。通过选择合适的存储格式,可以根据具体的应用场景来优化操作性能。

posted @   管道工人刘博  阅读(276)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2023-12-25 解决报错: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
2023-12-25 linux系统安装git
2023-12-25 CentOS 适合 Debian Package 还是 RPM Package
2023-12-25 如何将 python 升级
2023-12-25 在CentOS Linux系统上安装Docker
点击右上角即可分享
微信分享提示