使用相同的,不同的重复求解


12

我正在使用MATLAB解决一个涉及解决,其中每个时间步随着时间变化。现在,我正在使用MATLAB的:bAx=bbmldivide

x = A\b

我可以灵活地进行所需的预计算,因此我想知道是否有比更快和/或更准确的方法mldivide。通常在这里做什么?谢谢大家!


1
您对的结构有特定的了解吗?例如,它对称吗?正定?三对角线?正交的?A
Dominique

矩阵是密集的正方形矩阵。A
怀疑

3
如果您对没有其他知识,那么下面的答案中所述的分解是您的最佳选择。大号ùALU
Dominique

Answers:


14

您可以做的最明显的事情是预先计算

[L,U] = lu(A) 〜O(n ^ 3)

那你就算

x = U \ (L \ b) 〜O(2 n ^ 2)

这将极大地降低成本并使其更快。准确性将是相同的。


1
请注意,根据文档,L不一定是下三角形。这个答案可能比直接求解要快,但是我要确保L \ b命令足够聪明,知道以正确的顺序求解L(这可能是正确的,但并不能肯定在文档中)。
Godric Seer

是的,您是对的,L是下三角矩阵和置换矩阵的乘积。但是,如果它不认识到它所要做的就是用进行向后替换,那我该死的L\b。因为我已经看到那些我认为是专家的人在高性能代码中使用了这条确切的代码。
Milind R

8
mldivide可以识别置换的三角矩阵,并且可以在求解这样的系统时执行正确的事情。但是,在我的实验中,对于尺寸为2000到2000的矩阵到10000到10000的矩阵,这似乎会使求解过程减慢10倍左右。因此,最好使用[L]来明确跟踪排列,U,P] = lu(P)。O(n2)
Brian Borchers

1
另外,如果矩阵稀疏,则应利用稀疏性来求解系统。执行此操作的最简单方法是,在计算LU分解之前,通过使用A = sparse(A)确保以稀疏格式存储。您也可以尝试置换A的行,以减少LU分解期间的填充。A
Brian Borchers

3
@BrianBorcher据我所知,跟踪排列的最佳方法是[L,U,p] = lu(A,'vector'); x = U\(L\b(p));请参阅lu docs中的示例3 。
Stefano M

5

我们在有关该主题的科学计算课程中做了一些广泛的计算机实验室。对于我们在那里进行的“小”计算,即使我们尽可能优化了代码并事先对所有矩阵进行了排序(例如,使用反向Cuthill McKee对稀疏矩阵进行排序),Matlab的反斜杠运算符始终比其他任何运算符都快。 。

您可以查看我们的实验室说明之一。第4页(简短)介绍了您问题的答案。

切尼(Cheney)例如写了一本关于这个主题的好书。


4

假设是一个n × n的密集矩阵,您必须求解A x i = b ii = 1 m。如果够大那么就没有什么错An×n Axi=bii=1mm

V = inv(A);
...
x = V*b;

触发器是对和ø Ñ 2为,因此,为了确定用于盈亏平衡值需要一些试验...O(n3)inv(A)O(n2)V*bm

>> n = 5000;
>> A = randn(n,n);
>> x = randn(n,1);
>> b = A*x;
>> rcond(A)
ans =
   1.3837e-06
>> tic, xm = A\b; toc
Elapsed time is 1.907102 seconds.
>> tic, [L,U] = lu(A); toc
Elapsed time is 1.818247 seconds.
>> tic, xl = U\(L\b); toc
Elapsed time is 0.399051 seconds.
>> tic, [L,U,p] = lu(A,'vector'); toc
Elapsed time is 1.581756 seconds.
>> tic, xp = U\(L\b(p)); toc
Elapsed time is 0.060203 seconds.
>> tic, V=inv(A); toc
Elapsed time is 7.614582 seconds.
>> tic, xv = V*b; toc     
Elapsed time is 0.011499 seconds.
>> [norm(xm-x), norm(xp-x), norm(xl-x), norm(xv-x)] ./ norm(x)
ans =
   1.0e-11 *
    0.1912    0.1912    0.1912    0.6183

A1LUm>125

一些注意事项

有关稳定性和错误分析的信息,请参见对此不同答案的评论,尤其是VictorLiu的评论。

mn

使用Matlab R2011b在12核计算机上执行定时,UNIX平均值平均为5;tic, toc三个探针的最佳时间。


确实,矩阵矢量乘法比三角求解器具有更多的并行性,因此,如果以任何方式并行执行计算(多核/ GPU /等),则这一点应该更加明显。
阿隆·艾玛迪亚

@AronAhmadia我同意:仅基于操作计数的收支平衡点估计仅对串行实现有意义。
Stefano M

1
请注意,如果A矩阵是稀疏的,则情况将大不相同-逆通常会很密集,而LU因子通常是相当稀疏的,使事情朝LU更快的方向倾斜。
Brian Borchers

1
A

1
inv(A)Ax=bbBA\B

2

看一下这个问题,答案显示mldivide非常聪明,并且还提供了有关如何查看Matlab用于解决的建议A\b。这可能会给您有关优化选项的提示。


0

使用反斜杠或多或少等同于inv(A)*B,如果您自由编码,则反斜杠可能更直观。它们大致相同(在计算方式上略有不同),尽管您应查看Matlab文档以进行澄清。

要回答您的问题,反斜杠通常可以,但是它确实取决于质量矩阵的属性。


1
数学上inv(A)* b与\是相同的,但是在数值上,实际上形成反函数的效率和准确性都较低。如果您正在学习线性代数,这可能是可以接受的,但是我认为您需要一个很好的理由来形成逆代数。
Godric Seer

但是,为什么您要进行计算,inv(A)因为仅此一项就比它更昂贵A\b
Dominique

7
@Godric:最近有一篇文章讨论了inv(A)* b不太准确的“神话”:在ArXiv上。不是说通常有理由计算实际的逆,而是说。
维克多·刘

3
@Dominique:三角求解的可并行性远不及矩阵矢量乘法,并且复杂的预处理迭代方法通常在子域上使用直接方法。显式地形成一些中等大小的稠密三角矩阵的逆,以提高并行度通常是有用的。
杰克·普尔森

@VictorLiu:谢谢你的文章。我的准确性声明得到了纠正(至少inv(A)的智能实现)。
Godric Seer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.