稀疏矩阵乘法的传统方法是什么?

计算科学 稀疏矩阵
2021-12-05 22:22:31

当您将稀疏矩阵与其他稀疏矩阵或密集矩阵相乘时,每个矩阵的常规方法是什么?稀疏矩阵是如何存储的?矩阵乘法有什么作用?

我的理解是有几种存储方式:

(1) 将非零元素存储在哈希表中,其中键是二维索引(通常映射到一维),值是该索引处非零元素的值。

(2) 将非零元素存储在 ak大小的数组在哪里k是非零元素的数量。每个元素存储索引和该索引处的值。

(3) 与 (2) 类似,但你有一个n大小的数组在哪里n是原始矩阵的大小。对于数组的每个元素,您存储一个非零元素列表。

我不确定这些或其他一些公式中的哪一个在实践中以及在什么情况下使用。

我还有一个问题是我们知道这是如何在 BLAS 和 LAPACK 等线性代数包中完成的吗?

1个回答

根据应用程序的不同,有很多方法可以存储稀疏矩阵。最常见的是 CSC、CSR 和 COO,但我知道的类型有 20 多种,而且可能不止这些。

通常,您不想将稀疏矩阵相乘,因为这很昂贵。如果必须,很容易将 CSR 矩阵与 CSC 矩阵相乘,反之亦然。将两个 COO 矩阵相乘也不是那么难。Tim Davis 的 SuiteSparse 具有一些能够并行执行这些操作的函数。

将稀疏矩阵与密集矩阵相乘很容易。困难的部分是缓存管理。如果您不关心它,您可以从 Yousef Saad 的 Sparskit2 中获取 SpMat-Vec 操作,并将其重写为密集矩阵。很容易概括。

BLAS 和 LAPACK 不能进行稀疏矩阵运算。您需要使用 sparseBLAS/graphBLAS。我不知道任何功能完整的类似 LAPACK 的稀疏库,因为其中许多操作对于稀疏矩阵很难实现。此外,我们知道这些库是如何工作的,因为它们的开发是有据可查的,并且结果已经发布。如果您可以访问大学图书馆,您可以阅读自 70 年代以来关于这些主题的所有论文(从 BLAS/LAPACK 到线程并行和分布式版本以及稀疏/图线性代数)。