稀疏矩阵的压缩方式 CCS / CRS

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

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值