CSC 稀疏矩阵:为什么要对 Ax=b 问题的行数据进行排序?

计算科学 稀疏矩阵
2021-12-24 05:51:23

我有一个坐标格式的矩阵,我会将其转换为 CSC。作为参考,我使用的格式看起来像这样,但我没有使用 pointerE 矩阵,我认为这是多余的。

我的转换算法似乎很慢,而且我正在浪费一些时间按行号对行数据进行排序。我不知道为什么要这样做,因为我将简单地应用共轭梯度或 GMRES 方法,我只需要的结果,我认为我可以不排序行数据。Av^=...

有什么理由我应该对它们进行排序吗?

2个回答

我假设您在这里使用格式http://netlib.org/linalg/html_templates/node92.html

高效的内存访问!在做SpMV操作的时候,如果行数据没有排序,在读写向量的时候,内存中可能会有很多随机的来回跳转。请参阅下面的伪代码;y

for j=0 to n-1                      //loop over columns
  for i=col_ptr[j] to col_ptr[j+1]  //loop over rows
    y[row_ind[i]] += val[i]*x[j]    //y(row) += A(row,col) * x(col)
                                    //A(row,col) is stored at val[i] where i is s.t.
                                    //row_ind[i]=row and col_ptr[j]<=i<col_ptr[j+1]

当矩阵以某种方式结构化且很大时,从 RAM 中读取尤其重要,例如考虑有限元矩阵。

还要确定的是,您正在对每列的行数据进行排序,对吗?因为对 20 个左右的元素进行排序不会花费太多时间,即使您要进行 100,000 次。

除了@AbdullahAliSivas 的回答之外,还有一个问题是人们通常不会只写入一次矩阵条目。相反,一个人将多个贡献相加(例如,在有限元方法中,与一个自由度相邻的每个单元都会有贡献)并且经常还需要读取特定的矩阵条目。

如果您不对条目进行排序,那么查找添加另一个贡献或读取的位置将成为一个相当昂贵的步骤。