稀疏矩阵是一种存储和操作矩阵时只存储非零元素的数据结构,因为它节省了存储空间,尤其是在矩阵中大部分元素为零的情况下。以下是一些常用的方法来压缩存储稀疏矩阵:
1. 压缩稀疏行(CSR/CSC格式)
压缩稀疏行(CSR)格式:
值(Values): 存储所有非零元素。
列索引(Column Indices): 存储非零元素对应的列索引。
行指针(Row Pointers): 每一行的开始位置在值数组中的索引。
压缩稀疏列(CSC)格式:
值(Values): 与CSR相同。
行索引(Row Indices): 存储非零元素对应的行索引。
列指针(Column Pointers): 每一列的开始位置在值数组中的索引。
这两种格式都适用于不同类型的稀疏矩阵操作,CSR格式适合按行操作,而CSC格式适合按列操作。
2. 压缩稀疏块(CSB/CSCB格式)
这种方法将矩阵分割成更小的块,然后对每个块使用CSR或CSC格式进行压缩。
3. 压缩稀疏三对角矩阵(TSR/TSC格式)
对于具有三对角结构(即,除了主对角线外,只有上三角和下三角元素非零)的稀疏矩阵,可以使用这种格式。
4. 压缩稀疏带状矩阵(BSR/BSR格式)
对于带状稀疏矩阵,可以只存储带宽内的元素。
5. 压缩稀疏矩阵的Python实现
以下是一个使用Python实现CSR格式的简单例子:
```python
class CSRMatrix:
def __init__(self, values, row_indices, col_indices, shape):
self.values = values
self.row_indices = row_indices
self.col_indices = col_indices
self.shape = shape
def __getitem__(self, key):
row, col = key
if row < 0 or row >= self.shape[0] or col < 0 or col >= self.shape[1]:
raise IndexError("Index out of bounds")
index = self.row_indices[row]
end_index = self.row_indices[row + 1]
for i in range(index, end_index):
if self.col_indices[i] == col:
return self.values[i]
return 0
```
在这个例子中,`values` 是一个包含所有非零元素的列表,`row_indices` 和 `col_indices` 分别是列索引和行索引的列表,`shape` 是矩阵的形状(行数和列数)。
这些只是压缩稀疏矩阵的一些方法,具体选择哪种方法取决于你的具体需求和稀疏矩阵的特性。