Algorithm 稀疏矩阵-矩阵乘法
如何计算稀疏矩阵-矩阵乘积?我知道做这件事的“经典”数学方法,但它似乎效率很低。可以改进吗 我考虑将第一个矩阵存储在CSR表单中,第二个矩阵存储在CSC表单中,因此由于行和列向量已排序,因此我不必搜索我需要的特定行/列,但我想这不会有多大帮助。免责声明如下:(I)您确实不想实现自己的稀疏矩阵包;(ii)如果你需要的话,你应该读蒂姆·戴维斯的《稀疏线性代数》一书,这里是如何做稀疏矩阵乘法 通常天真的密集乘法是这样的Algorithm 稀疏矩阵-矩阵乘法,algorithm,sparse-matrix,matrix-multiplication,Algorithm,Sparse Matrix,Matrix Multiplication,如何计算稀疏矩阵-矩阵乘积?我知道做这件事的“经典”数学方法,但它似乎效率很低。可以改进吗 我考虑将第一个矩阵存储在CSR表单中,第二个矩阵存储在CSC表单中,因此由于行和列向量已排序,因此我不必搜索我需要的特定行/列,但我想这不会有多大帮助。免责声明如下:(I)您确实不想实现自己的稀疏矩阵包;(ii)如果你需要的话,你应该读蒂姆·戴维斯的《稀疏线性代数》一书,这里是如何做稀疏矩阵乘法 通常天真的密集乘法是这样的 C = 0 for i { for j { for k {
C = 0
for i {
for j {
for k {
C(i, j) = C(i, j) + (A(i, k) * B(k, j))
}
}
}
由于加法可以转换,我们可以按自己喜欢的方式排列循环索引。让我们把j
放在最外层,把i
放在最内层
C = 0
for j {
for k {
for i {
C(i, j) = C(i, j) + (A(i, k) * B(k, j))
}
}
}
以CSC形式存储所有矩阵。由于
j
是最外层的,我们在B
和C
(但不是a
)上一列一列地工作。中间的循环位于k
上方,即B
行,非常方便,我们不需要访问B
中为零的条目。这使得外部两个循环按自然顺序遍历B
的非零项。内环将C
的j
第列增量为A
的k
第列的B(k,j)
。为了简化此操作,我们将C
的当前列以及该列为非零的索引集密集存储为列表/密集布尔数组。我们避免通过通常的隐式初始化技巧编写所有的C
或布尔数组。这看起来像是重复的Uhm,在我看来不是。问题是“是否有更好的压缩格式更适合矩阵运算”。我要求一个更好的算法来乘两个矩阵。