Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 稀疏矩阵-矩阵乘法_Algorithm_Sparse Matrix_Matrix Multiplication - Fatal编程技术网

Algorithm 稀疏矩阵-矩阵乘法

Algorithm 稀疏矩阵-矩阵乘法,algorithm,sparse-matrix,matrix-multiplication,Algorithm,Sparse Matrix,Matrix Multiplication,如何计算稀疏矩阵-矩阵乘积?我知道做这件事的“经典”数学方法,但它似乎效率很低。可以改进吗 我考虑将第一个矩阵存储在CSR表单中,第二个矩阵存储在CSC表单中,因此由于行和列向量已排序,因此我不必搜索我需要的特定行/列,但我想这不会有多大帮助。免责声明如下:(I)您确实不想实现自己的稀疏矩阵包;(ii)如果你需要的话,你应该读蒂姆·戴维斯的《稀疏线性代数》一书,这里是如何做稀疏矩阵乘法 通常天真的密集乘法是这样的 C = 0 for i { for j { for k {

如何计算稀疏矩阵-矩阵乘积?我知道做这件事的“经典”数学方法,但它似乎效率很低。可以改进吗

我考虑将第一个矩阵存储在CSR表单中,第二个矩阵存储在CSC表单中,因此由于行和列向量已排序,因此我不必搜索我需要的特定行/列,但我想这不会有多大帮助。

免责声明如下:(I)您确实不想实现自己的稀疏矩阵包;(ii)如果你需要的话,你应该读蒂姆·戴维斯的《稀疏线性代数》一书,这里是如何做稀疏矩阵乘法

通常天真的密集乘法是这样的

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,在我看来不是。问题是“是否有更好的压缩格式更适合矩阵运算”。我要求一个更好的算法来乘两个矩阵。