使用动态计算的矩阵元素进行快速矩阵乘法(不形成矩阵)

计算科学 线性代数 拉帕克 布拉斯 密集矩阵
2021-11-27 15:46:39

是否有任何用于高性能矩阵矩阵乘积的库或例程,其中矩阵元素是使用给定函数即时计算的ij?

更具体地说,在我目前面临的问题中,我必须计算一个矩阵矩阵乘积

y=Ab

其中是一个对称矩阵AN×NybN×3

使用 LAPACK 或 BLAS 例程需要形成矩阵然而,矩阵元素是一个仅依赖于矩阵索引的函数。Ai,j

1个回答

如果矩阵足够小以适合内存,那么实际形成元素当然没有相关成本:无论如何,您必须至少计算一次元素才能执行矩阵向量乘积,因此您不妨存储您在内存中计算的值,然后在其上运行优化的矩阵向量积函数。

但当然也有你真的不能或不想计算和存储矩阵条目的情况。一个例子是如果其中是其他矩阵并且通过更便宜。其他情况是不适合内存。A=BCBCy=AbB(Cb)(BC)bA

在这些情况下,您需要一个库来允许您通过它的action来实现一个矩阵,即它的矩阵向量积。一个例子是 PETSc,您可以在其中创建一个MatShell对象——一个矩阵,您需要为其提供一个指针,该指针指向可以执行矩阵向量乘积的函数。大多数其他线性代数库都具有类似的功能——我很确定 Trilinos 可以做到这一点,而 deal.II(免责声明:这是我与之相关的一个项目)通过创建提供矩阵的类来在所有地方做到这一点——向量乘法成员函数。