反转此 LU 分解时如何避免不必要的检查

计算科学 线性代数 matlab 表现 矩阵分解
2021-12-12 08:04:39

问题的背景

我目前正在研究一个 Matlab 代码,其中必须求解线性方程组,...。由于矩阵在模拟过程中是恒定的,因此我在开始时将其一劳永逸地进行 LU 分解,并将第个系统求解为Ax1=b1Ax2=b2An

xn = U\(L\bn);

在这一点上,可能值得一提的是,我一次只知道一个向量,这意味着我不能一次解决所有方程。b

如下图所示,矩阵非常稀疏,因此我将它们存储为稀疏格式。此外,它们是上三角形和下三角形。通过查看运算符“\”的文档可以看出,Matlab 最终将使用三角求解器来求解系统。然而,在此之前,它必须查看是否为正方形,计算它们的带宽,查看它们是否是对角线,检查它们是否看起来是三角形的,最后在使用三角形求解器之前检查它们是否真的是三角形的。LULU

实际问题

我的问题是是否有办法绕过所有这些检查并直接进入三角求解器?

到目前为止我尝试了什么

到目前为止,我已经研究了函数“linsolve”并使用“dsp.LowerTriangularSolver”和“dsp.UpperTriangularSolver”创建了上三角求解器和下三角求解器。不幸的是,所有这些都只适用于完整的矩阵。

U的稀疏模式] L 的稀疏模式

1个回答

看起来 usingdecomposition会简化您的代码,并将此问题作为副作用消除。

dA = decomposition(A);
for k = 1:n
    b = compute_b(i);
    x(:,k) = dA \ b;
end

无论如何,这看起来很像过早的优化。为什么您认为这些检查对性能有很大影响?