sparse matrix 存储

本文深入探讨了SparseMatrix中CSR(Compressed Sparse Row)存储格式的应用,详细介绍了通过使用三个数组(mValues, mColumnIds, mRowIds)来描述SparseMatrix非零元素的方法,并阐述了如何通过类CMatrix遍历和操作这些数据。同时强调了CSR格式便于并行计算的优势,适用于多种并行计算框架如OpenMP、CUDA、OpenCL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于sparse matrix的特殊性,在存储的时候,一般情况下吃用CSR(Compressed Sparse Row)这种format来实现。通过使用3个数组来描述一个Sparse Matrix.

double* mValues; // 保存Sparse Matrix 非0的值。

int* mColumnIds; //保存column ID

int* mRowIds; //保存各行第一个非零value在mColumnIds的位置。

使用类来描述这个Sparse Matrix,可以这样:

class CMatrix

{

protected:

       double* mValues;

       int*       mColumnIds;

       int*       mRowIds;  

      int          mNoRows; //有多少行。

};

通过每行来遍历这个sparse matrix:

for(int i = 0; i < mNoRows; i++)

{

         for(int j = mColumnIds[i]; j < mColumnIds[i + 1]; ++j)

         {

                   //mValues[i * mNoRows + j] = .....      //第i行第j列的值。

         }

}


CSR是最常用的一种,这种方式可以很方便使用OpenMP,CUDA, OpenCL来进行并行计算。

### 稀疏矩阵的概念与实现 稀疏矩阵是指其中大部分元素为零的矩阵。相比于密集矩阵(dense matrix),稀疏矩阵通过仅存储非零元素的方式节省大量内存空间并提高计算效率[^1]。 #### 1. Python 中的稀疏矩阵实现 Python 的 SciPy 库提供了强大的工具集来处理稀疏矩阵。以下是几种常见的稀疏矩阵格式以及其特点: - **CSR (Compressed Sparse Row)**: 这是最常用的稀疏矩阵形式之一,特别适合行访问频繁的操作,比如切片和矩阵乘法。 - **CSC (Compressed Sparse Column)**: 类似于 CSR,但是针对列进行了优化。 - **COO (Coordinate List)**: 存储的是非零元素的位置及其对应的值,适用于逐步构建稀疏矩阵的情况。 下面是一些具体的代码示例演示如何创建和操作这些稀疏矩阵: ```python from scipy.sparse import csr_matrix, csc_matrix, coo_matrix # 使用 COO 格式创建一个简单的稀疏矩阵 row = [0, 3, 1, 0] col = [0, 3, 1, 2] data = [4, 5, 7, 9] coo_mat = coo_matrix((data, (row, col)), shape=(4, 4)) print("COO Matrix:") print(coo_mat.toarray()) # 转换为 CSR 格式的稀疏矩阵 csr_mat = coo_mat.tocsr() print("\nCSR Matrix:") print(csr_mat) # 转换为 CSC 格式的稀疏矩阵 csc_mat = coo_mat.tocsc() print("\nCSC Matrix:") print(csc_mat) ``` 此段代码分别展示了如何使用 `coo_matrix` 来初始化稀疏矩阵,并将其转换成更高效的 CSR 或者 CSC 表达形式。 #### 2. 稀疏矩阵的应用场景 在实际应用中,稀疏矩阵广泛应用于多个领域,包括但不限于推荐系统、自然语言处理(NLP)中的文档向量化表示(TF-IDF),还有图像识别等领域。例如,在 NLP 场景下,文本特征提取后的结果往往是非常高维而极其稀疏的数据集合;此时采用稀疏矩阵不仅可以减少不必要的存储开销,还能加速后续算法运行速度[^2]。 另外值得注意的一点是,像 LightGBM 这样的高效梯度提升决策树框架也充分利用了稀疏矩阵的优势——快速训练过程、较低内存消耗等特性使其成为解决大规模分类回归问题的理想选择[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值