之前关于矩阵压缩存储的知识都是网上看的,比如这篇
稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
里面对ia数组,即行偏移数组的表述是这样的。强调了ia数组中存的是某行的第一个元素的偏移。
今天测试一个国外数学教授开源的AGMG库时才发现如果按之前的理解,还原后的矩阵将和理论上的无法统一。
翻看维基发现,CSR的ia定义并没有说其存储的是第一个元素的偏移信息。ia只是存储了非零行的start索引,这里的start与该行第一个非零元在ja和a中的索引没有关系,其实只是表示了该行中的非零元对应的col值和val值分布在ja[row_start]~ja[row_end],a[row_start]~a[row_end]之间。也就是说,该行中的非零元对应的col和val在ja和a中的顺序可以是随意的,不是必须从左到右,即对应col值从小到大。
以第一幅图的矩阵为例
1 | 7 | 0 | 0 |
0 | 2 | 8 | 0 |
5 | 0 | 3 | 9 |
0 | 6 | 0 | 4 |
按之前片面的理解,ia,ja,a只能固定格式如下,(用0做基)
ia: 0 2 4 7 9
ja: 0 1 1 2 0 2 3 1 3
a: 1 7 2 8 5 3 9 6 4
其实还可以这么写
ia: 0 2 4 7 9
ja: 1 0 2 1 3 2 0 3 1
a: 7 1 8 2 9 3 5 4 6
虽然ia一样,但每行的非零元们在ja和a中属于该行的slice中的索引排序不分先后。
之所以出现之前的片面理解是因为我们习惯了矩阵的Z字形读法,都按第一种来了。