稀疏矩阵压缩存储:CSR/CSC (Compress Sparse Row/Column)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了稀疏矩阵压缩存储:CSR/CSC (Compress Sparse Row/Column)相关的知识,希望对你有一定的参考价值。

参考技术A

假设有一非对称 矩阵A,用CSR表示需要三个向量: val , col_ind , row_ptr 。表示的意义为:

, then
, then

并约定: ,其中, 为A中非零值的个数

它的CSR表示为:

特别说明一下 row_ptr 的表示含义:
如 row_ptr[2]=3 ,表明矩阵A中第二行(从左至右)的第一个非零值是A中所有非零值的第3个; row_ptr[5]=13 ,表明矩阵A中第五行(从左至右)的第一个非零值是A中所有非零值的第13个; row_ptr[7]=20 指示A中非零值nnz的个数:nnz=20-1=19。

更新CSC的介绍 :它的基本思想和CSR完全相同,可以看作CSR的转置,因此这里仅对CSC进行简单的举例介绍。以Song Han的EIE论文为例,PE应存储的weight矩阵为(相同颜色的对应一个PE):

这一矩阵的采用CSC表示为:

解释 ”:和上面的CSR表示不同,这里的索引从0开始(上面的CSR举例从1开始,当然也可以从0开始)。index对应的是非零值所在行的index,而pointer指示原始矩阵中每列非零值的数量,pointer的最后一位指示矩阵中非零值的个数。
如 pointer[1]=3 ,表明第二列之前(第一列)含三个非零值,第二列(由上至下)第一个非零值应是所有非零值中的第四个; pointer[2]=4 ,表明第三列之前有四个非零值,第三列(由上至下)第一个非零值应是所有非零值中的第五个; pointer[3] 和 pointer[4] 相等,表明第四列没有非零值;最后, pointer[8]=13 ,表示weight矩阵中共有13个非零值。
需要注意的是,这里的Row index是相对的,即相对前一个非零值或第一行的index,上面的CSR中的Column index是绝对的。 可根据实际要求选择绝对或相对表示。

方程组稀疏矩阵索引的MATLAB存储器管理

我想知道MATLAB如何为包括稀疏矩阵索引的以下方程组进行内存管理。

x = A(indices,indices)  b(indices);

A是稀疏对称矩阵,b是列向量,indices具有A元素的索引,包含在方程组Ax = b中。

我认为A存储为CSC(压缩稀疏列)。然后使用不同的CSC数据将其临时存储在存储器中。新的CSC最终用于b(indices)方程组,类似于以下内容:

Aindexed = A(indices,indices); % New symmetric sparse matrix
bindexed = b(indices);
x = Aindexed  bindexed;

MATLAB是否有特殊的稀疏求解器和矩阵索引?我认为MATLAB在求解器中进行索引的可能性较小,稀疏矩阵必须在求解器中使用之前进行索引。这些只是我的猜测。有人可以对这个问题有所了解吗?谢谢。

答案

稀疏线性求解器通常使用基于链表或邻接结构的存储方案。第一种方法更灵活,允许容易地包含新元素,压缩等。第二种方案在RAM要求方面是经济的,并且还为处理算法提供了更好的性能,但是不可能包含/排除元素。如果您访问以下博客,可以找到更多信息并询问具体问题:http://comecau.blogspot.com/2018_09_05_archive.html

以上是关于稀疏矩阵压缩存储:CSR/CSC (Compress Sparse Row/Column)的主要内容,如果未能解决你的问题,请参考以下文章

稀疏矩阵压缩存储:CSR

稀疏矩阵 - 矩阵乘法

SciPySparse稀疏矩阵主要存储格式总结(转载)

方程组稀疏矩阵索引的MATLAB存储器管理

稀疏矩阵(Sparse Matrix)

如何对存储为“压缩稀疏行”的矩阵进行稀疏矩阵索引?