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

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

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

【问题讨论】:

  • 嗯,在我看来不是。那个问题是'是否有更好的压缩格式更适合矩阵-矩阵运算'。我要求一个更好的算法来将两个矩阵相乘。

标签: algorithm sparse-matrix matrix-multiplication


【解决方案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 或布尔数组。

【讨论】:

    猜你喜欢
    • 2017-07-20
    • 2011-11-20
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    相关资源
    最近更新 更多