稀疏矩阵 - 矩阵乘法

Posted

技术标签:

【中文标题】稀疏矩阵 - 矩阵乘法【英文标题】:Sparse matrix - matrix multiplication 【发布时间】:2014-03-26 00:50:05 【问题描述】:

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

我曾考虑将第一个矩阵存储为 CSR 形式,将第二个矩阵存储为 CSC 形式,因此由于行向量和列向量已排序,因此我不必搜索我需要的特定行/列,但我猜没有多大帮助。

【问题讨论】:

这似乎是重复的***.com/questions/19022226/… 嗯,在我看来不是。那个问题是'是否有更好的压缩格式更适合矩阵-矩阵运算'。我要求一个更好的算法来将两个矩阵相乘。 【参考方案1】:

免责声明 (i) 您真的不想实现自己的稀疏矩阵包,并且 (ii) 如果您需要,您应该阅读 Tim Davis 关于稀疏线性代数的书,这里是如何做一个稀疏的矩阵乘法。

通常的朴素密集乘法看起来像这样。

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 位于最外层,我们在BC(但不是A)上一次次处理列。中间循环结束于k,即B 的行,并且,很方便,我们不需要访问B 中为零的条目。这使得外部两个循环以自然顺序遍历B 的非零条目。内部循环将Cjth 列增加Akth 列乘以B(k, j)。为了简单起见,我们将C 的当前列以及该列非零的索引集密集存储为列表/密集布尔数组。我们避免通过通常的隐式初始化技巧写入所有 C 或布尔数组。

【讨论】:

以上是关于稀疏矩阵 - 矩阵乘法的主要内容,如果未能解决你的问题,请参考以下文章

如何在TensorFlow中执行稀疏矩阵*稀疏矩阵乘法?

稀疏矩阵乘法

稀疏矩阵的存储和乘法操作

python 多线程稀疏矩阵乘法

MATLAB 稀疏矩阵

稀疏矩阵乘法复杂度