当A和B都是大矩阵时,在MATLAB中用AX = B求解X的有效方法

Joh*_*ith 6 matlab linear-algebra sparse-matrix matrix-inverse factorization

我有这个问题,这需要解决XAX=B.A是15000 x 15000的顺序,是稀疏和对称的.B是15000 X 7500并且不稀疏.解决X的最快方法是什么?

我可以想到两种方式.

  1. 最简单的方式, X = A\B
  2. 使用for循环,

    invA = A\speye(size(A))
    for i = 1:size(B,2)
        X(:,i) = invA*B(:,i);
    end
    
    Run Code Online (Sandbox Code Playgroud)

有没有比上面两个更好的方法?如果没有,我提到的两者之间哪一个最好?

ang*_*nor 9

首先第一件事情-永远,永远计算答:这是逆从未除了当A是对角矩阵稀疏.尝试使用简单的三对角矩阵.这条线本身会杀死你的代码 - 记忆方面和性能方面.并且计算逆数在数值上不如其他方法准确.

一般来说,\应该对你有用.MATLAB确实认识到你的矩阵是稀疏的并且执行稀疏因子分解.如果将矩阵B作为右侧,则性能比仅使用b向量求解一个方程组要好得多.所以你正确地做到了.你可以在这里尝试的唯一其他技术是显式调用lu,, chol或者ldl,取决于你拥有的矩阵,并自己执行向后/向前替换.也许你在那里节省一些时间.

事实上,求解线性方程组的方法,特别是稀疏系统,很大程度上取决于问题.但在我想象的几乎任何(稀疏)情况下,15k系统的分解应该只需要几分之一秒.现在这不是一个大型系统.如果您的代码很慢,这可能意味着您的因素不再是稀疏稀疏.您需要确保在稀疏分解期间正确地重新排序矩阵以最小化填充(添加非零条目).这是至关重要的一步.请查看此页面,了解有关如何重新排序系统的一些测试和说明.并简要介绍一下此SO线程的示例重新排序.