为了节省存储空间并且加快并行程序处理速度,需要对稀疏矩阵进行压缩存储,压缩存储的原则是:不重复存储相同元素;不存储零值元素。常用的几种矩阵的存储格式如下:COO,CSR,DIA,ELL,HYB等;一般情况下,稀疏矩阵指的是元素大部分是0的矩阵(有些资料定义非零元素不超过5%的矩阵,为稀疏矩阵);所以如何高效存储以及其格式如何确定,往往会影响并行程序的运行效率。
接下来介绍几种存储格式:
(一)Coordinate(COO)
这种存储格式比较简单易懂,每一个元素需要用一个三元组来表示,分别是(行号,列号,数值),对应上图右边的一列。这种方式简单,但是记录单信息多(行列),每个三元组自己可以定位,因此空间不是最优。
(二)Compressed Sparse Row (CSR)
这是经常用的一种,我们会经常在一些标准的线性代数库或者数值运算库中看到此方式存储;CSR是比较标准的一种,也需要三类数据来表达:数值,列号,以及行偏移。CSR不是三元组,而是整体的编码方式。数值和列号与COO一致,表示一个元素以及其列号,行偏移表示某一行的第一个元素在values里面的起始偏移位置。如上图中,第一行元素1是0偏移,第二行元素2是2偏移,第三行元素5是4偏移,第4行元素6是7偏移。在行偏移的最后补上矩阵总的元素个数,本例中是9。
CSC是和CSR相对应的一种方式,即按列压缩的意思。
以上图中矩阵为例:
Values: [1 5 7 2 6 8 3 9 4]
Row Indices:[0 2 0 1 3 1 2 2 3]
Column Offsets:[0 2 5 7 9]
再来看一个CSR的例子[4]: