我有一个非对称的稀疏矩阵 IE 稀疏度有点随机,我不能指望所有值都与对角线相距一定距离。
但是,它仍然是稀疏的,我想减少对矩阵的存储需求。因此,我试图弄清楚如何存储从第一个非零开始的每一行,直到我到达最后一个非零。
也就是说,如果第 m 行的第一个非零出现在第 2 列,最后一个非零出现在第 89 列,我想存储在 A[m] 行 2-> 89 中。
由于每一行没有相同数量的非零,我将使 A 的所有行都具有相同数量的元素,并将零填充到具有较少数量非零元素的行的行尾.
我如何在 C 中进行此翻译?我实际上没有原始的完整矩阵来复制值(原始矩阵以 CSR 形式出现在我身边)。如果我在 fortran 中执行此操作,我可以将我的数组定义为二维的,并且通过跟踪非零列的开始/停止值并像这样存储它,让每一行都是可变长度的。
我将尝试在下面演示:
这是我知道的值的矩阵表示 - 对于每个值,我知道行和列的位置
[1 2 3 4 ]
[ 5 6 7 8 ]
[ 10 11 12 13 ]
m[ 14 15 16 17 18 ]
[ 19 20 21 22 ]
现在这一行在m
第一个非零和最后一个非零之间具有最大的“跨度”,所以我的新矩阵将是5x[span of row m]
[1 2 3 4 ]
[5 6 7 8 ]
[10 11 12 13 ]
m[14 15 16 17 18]
[19 20 21 22 ]
如您所见,行m
不需要零填充,因为它是最长的“跨度”
其他行现在都将零行作为第一个非零,并在每个非零之间保持零列的间距。