稀疏矩阵压缩存储:CSR/CSC (Compress Spars

2020-08-16  本文已影响0人  Leonui

介绍

The compressed row and column storage formats are the most general: they make absolutely no assumptions about the sparsity structure of the matrix, and they don't store any unnecessary elements. On the other hand, they are not very efficient, needing an indirect addressing step for every single scalar operation in a matrix-vector product or preconditioner solve.

文字描述

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

数学表示

val(k) =a_{i,j}, then col\_ind(k) = j
val(k) =a_{i,j}, then row\_ptr(i) \leq k <row\_ptr(i+1)

并约定:row\_ptr(n+1) = nnz + 1,其中,nnz为A中非零值的个数

举例

6*6 矩阵A

它的CSR表示为:

CSR格式的A

特别说明一下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举例介绍

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

PE应存储的原始weight矩阵
单独分析一个PE,以PE0为例,它所存储的weight矩阵如下所示: PE0存储的weight矩阵

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

weight矩阵的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是绝对的。可根据实际要求选择绝对或相对表示。

参考

上一篇下一篇

猜你喜欢

热点阅读