稀疏矩阵数据结构
稀疏矩阵(Sparse Matrix)是一种大多数元素为零的矩阵。在处理稀疏矩阵时,如果我们直接使用常规的二维数组来存储矩阵数据,将会浪费大量的存储空间,因为大部分元素都是零。为了解决这一问题,稀疏矩阵数据结构应运而生,通过只存储非零元素来大幅减少内存消耗。
最常用的稀疏矩阵存储格式包括 压缩行存储(CSR) 和 压缩列存储(CSC)。这两种格式是用于存储稀疏矩阵的标准方法。
1. 压缩行存储(CSR,Compressed Sparse Row)
CSR 是一种常用的稀疏矩阵存储方式,它将矩阵的非零元素按行存储,并记录每行中非零元素的位置。CSR格式通过三个数组来存储稀疏矩阵的数据:
- values:存储矩阵中的所有非零元素。
- column_indices:存储每个非零元素对应的列索引。
- row_pointer:指示每行开始非零元素的位置。在这个数组中,元素
row_pointer[i]
表示第i
行的第一个非零元素在values
数组中的位置。
举个例子:
假设我们有一个 4x5 的稀疏矩阵如下:
[
\begin{bmatrix}
0 & 0 & 3 & 0 & 0 \
0 & 0 & 0 & 4 & 0 \
5 & 0 & 0 & 0 & 6 \
0 & 7 & 0 & 0 & 0
\end{bmatrix}
]
对于这个矩阵,使用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 的稀疏矩阵如下:
[
\begin{bmatrix}
0 & 0 & 3 & 0 & 0 \
0 & 0 & 0 & 4 & 0 \
5 & 0 & 0 & 0 & 6 \
0 & 7 & 0 & 0 & 0
\end{bmatrix}
]
对于这个矩阵,使用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个:values 、column_indices 、row_pointer |
3个:values 、row_indices 、column_pointer |
适用的操作 | 快速按行遍历、矩阵乘法、求解线性方程组等 | 快速按列遍历、矩阵乘法、求解线性方程组等 |
优势 | 对于按行访问较快(例如:矩阵-向量乘法) | 对于按列访问较快(例如:矩阵-向量乘法) |
适用场景 | 行操作为主的稀疏矩阵运算(如行扫描) | 列操作为主的稀疏矩阵运算(如列扫描) |
4. 其他稀疏矩阵格式
除了CSR和CSC格式外,还有一些其他的稀疏矩阵存储格式:
- COO(Coordinate List)格式:通过三组数组来存储矩阵的行索引、列索引和非零值,适合于稀疏矩阵的插入操作。
- DIA(Diagonal Storage)格式:适用于对角线矩阵,通过存储每一对角线上的非零元素来节省空间。
- LIL(List of Lists)格式:每行的非零元素用链表存储,适用于稀疏矩阵的动态修改。
5. 稀疏矩阵操作
在稀疏矩阵中,常见的操作有:
- 矩阵乘法:稀疏矩阵乘法可以利用稀疏矩阵的数据结构高效实现,只对非零元素进行运算。
- 矩阵转置:稀疏矩阵的转置可以通过调整矩阵的行列索引来实现。
- 求解线性方程组:稀疏矩阵经常用于求解线性方程组,通过专门的稀疏求解器(如CG、GMRES)可以高效地处理。
6. 总结
使用稀疏矩阵数据结构(如CSR、CSC格式)可以有效减少存储和计算开销,尤其是在处理大规模稀疏矩阵时。通过选择合适的存储格式,可以根据具体的应用场景来优化操作性能。
标签:存储,元素,矩阵,稀疏,CSC,非零,格式,数据结构,CSR From: https://www.cnblogs.com/liuyajun2022/p/18631155