稀疏矩阵 - 矩阵乘法
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
位于最外层,我们在B
和C
(但不是A
)上一次次处理列。中间循环结束于k
,即B
的行,并且,很方便,我们不需要访问B
中为零的条目。这使得外部两个循环以自然顺序遍历B
的非零条目。内部循环将C
的j
th 列增加A
的k
th 列乘以B(k, j)
。为了简单起见,我们将C
的当前列以及该列非零的索引集密集存储为列表/密集布尔数组。我们避免通过通常的隐式初始化技巧写入所有 C
或布尔数组。
【讨论】:
以上是关于稀疏矩阵 - 矩阵乘法的主要内容,如果未能解决你的问题,请参考以下文章