我有一个坐标格式的矩阵,我会将其转换为 CSC。作为参考,我使用的格式看起来像这样,但我没有使用 pointerE 矩阵,我认为这是多余的。
我的转换算法似乎很慢,而且我正在浪费一些时间按行号对行数据进行排序。我不知道为什么要这样做,因为我将简单地应用共轭梯度或 GMRES 方法,我只需要的结果,我认为我可以不排序行数据。
有什么理由我应该对它们进行排序吗?
我有一个坐标格式的矩阵,我会将其转换为 CSC。作为参考,我使用的格式看起来像这样,但我没有使用 pointerE 矩阵,我认为这是多余的。
我的转换算法似乎很慢,而且我正在浪费一些时间按行号对行数据进行排序。我不知道为什么要这样做,因为我将简单地应用共轭梯度或 GMRES 方法,我只需要的结果,我认为我可以不排序行数据。
有什么理由我应该对它们进行排序吗?
我假设您在这里使用格式http://netlib.org/linalg/html_templates/node92.html
高效的内存访问!在做SpMV操作的时候,如果行数据没有排序,在读写向量的时候,内存中可能会有很多随机的来回跳转。请参阅下面的伪代码;
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 的回答之外,还有一个问题是人们通常不会只写入一次矩阵条目。相反,一个人将多个贡献相加(例如,在有限元方法中,与一个自由度相邻的每个单元都会有贡献)并且经常还需要读取特定的矩阵条目。
如果您不对条目进行排序,那么查找添加另一个贡献或读取的位置将成为一个相当昂贵的步骤。