Sparse Matrix 稀疏矩阵
Storage 存储方式
Compressed Row Storage (CRS)
压缩行的存储。这使用行优先的存储方式,即把矩阵转成一维数组时,行优先进行。
使用3个向量来表示稀疏矩阵:
- values:存储非0的数值
- col_index:记录非0数值的在矩阵里的列索引 (0-based index)。
- row_ptr:记录矩阵每行的第一个非0数值 在values中的索引。
举例,一个3行4列的矩阵:
[
[11, 0, 13, 17],
[0, 0, 19, 0],
[0, 23, 27, 0]
]
则使用3个向量表示它:
values | [11, 13, 17, 19, 23,27] |
---|---|
col_index | [0, 2, 3, 2, 1, 2] |
row_ptr | [0, 3, 4, 6] |
对row_ptr的补充:
[0, 3, 4, 6]中,
0:矩阵第一行数11在values的索引是0.
3: 矩阵第二行的第一个数值19 在values中的索引是3.
4:矩阵第三行的第一个数值23 在values中的索引是4.
6:显然矩阵没有第四行。6表示当矩阵有虚拟的第四行时,6就是这虚拟行的第一个值在values里的索引。因此,6也是values的元素数量。
问题: 如何从这3个向量得知原始矩阵的行列数?
解答:
行数 = length(row_ptr) -1
列数 = max(col_index)
问题:如何用这3个向量表示的稀疏矩阵 转换成 稠密矩阵?
解答:
通过row_ptr可得到values中每个元素的row_index,再结合col_index和values,即可以生成稠密矩阵了。
问题:为什么不类似col_index 使用row_index,而是使用row_ptr呢?
解答:如果使用 row_index的话,row_index是 [0, 0, 0, 1, 2, 2] 显然这里有重复的数值。为了进一步减少存储空间,使用row_ptr。
Compressed Column Storage (CCS)
压缩列的存储。对矩阵转成一维数组时,用列优先做。
则上面的矩阵:
[
[11, 0, 13, 17],
[0, 0, 19, 0],
[0, 23, 27, 0]
]
则使用3个向量表示它:
values | [11, 23, 13, 19, 27, 17] |
---|---|
row_index | [0, 2, 0, 1, 2, 0] |
col_ptr | [0, 1, 2, 5, 6] |
描述:
values:按照列优先取值,形成的数组或向量
row_index: values中每个元素的行下标。
col_ptr: 每一列的首位数,即11,13,17 分别在values中的index。col_ptr的最后一个元素是 size(values)
为了方便对col_ptr理解,也可以先类似row_index, 写出来 col_index: [0, 1, 2, 2, 2, 3],那么这里的数值 0/1/2/3的下标分别是 0,1,2,5,此为col_ptr的前 (n-1)个数。
参考
http://netlib.org/linalg/html_templates/node91.html#sparseA
http://netlib.org/linalg/html_templates/node92.html