提高复杂对称系统矩阵LU分解效率和内存需求的方法

计算科学 矩阵分解 效率 内存管理 对称 复数
2021-12-16 22:48:48

我想Ax=b使用 LU 分解求解一组线性方程 ( )。我的"A"矩阵是一个对称的复杂矩阵。我工作的代码有两个部分。在第一部分中,我进行所有初始化,计算矩阵的 L 和 U 因子。代码的第二部分在每个时间步(在开头指定)中运行。在本节中,我求解方程Ld=b and Ux=d以找到解向量x运行这部分的计算机内存有限。另外,我希望这部分尽可能高效。

所以我的问题是:

  1. 有没有办法节省一些内存来存储对称复矩阵的 L 和 U 矩阵?如果我只处理一个逆而不是 L 并且 UI 可以只存储矩阵的一半。是否有类似的方法可以为 L 和 U 矩阵节省一些存储空间。

  2. 我可以使用哪些方法来提高复杂对称矩阵的 LU 分解效率?

1个回答

您可能需要对表单进行分解A=LDLT, 它当然可以应用于复杂的对称A. LAPACK 在 [zsytrf] 中实现了这种分解,并在 [zsytrs] 中提供了相应的反解例程。该算法也有稀疏直接版本。PARDISO、TAUCS 和 MyraMath 都实现了它(免责声明:我写了最后一个)。

EDIT1:关于反向解决方案的效率,它可能不是很好。与 LU [zgetrf] 和 Cholesky [zpotrf] 不同,[zsytrf] 使用的算法在技术上不提供与 BLAS 的三角形例程(例如 [ztrsm])的布局兼容的三角形因子。相反,它存储LD交错为一堆 1x1 和 2x2 块(有点随意,基于旋转决策),这意味着后解决方案需要类似的 rank-1 和 rank-2 步骤序列(这种繁琐的后解决方案过程是 LAPACK 提供 [zsytrs ] 开始)。不幸的是,这是所有 BLAS1/BLAS2 级别的性能。解开的算法L转换成 BLAS3 兼容的三角矩阵很繁琐。

EDIT2:如果您的输入很少,我会使用一个处理所有这些的包。从 PARDISO 开始,它已经存在于 MKL 中。可能不值得深入研究任何细节。