Answers:
您可以做的最明显的事情是预先计算
[L,U] = lu(A)
〜O(n ^ 3)
那你就算
x = U \ (L \ b)
〜O(2 n ^ 2)
这将极大地降低成本并使其更快。准确性将是相同的。
L\b
。因为我已经看到那些我认为是专家的人在高性能代码中使用了这条确切的代码。
我们在有关该主题的科学计算课程中做了一些广泛的计算机实验室。对于我们在那里进行的“小”计算,即使我们尽可能优化了代码并事先对所有矩阵进行了排序(例如,使用反向Cuthill McKee对稀疏矩阵进行排序),Matlab的反斜杠运算符始终比其他任何运算符都快。 。
您可以查看我们的实验室说明之一。第4页(简短)介绍了您问题的答案。
切尼(Cheney)例如写了一本关于这个主题的好书。
假设是一个n × n的密集矩阵,您必须求解A x i = b i,i = 1 … m。如果米是够大那么就没有什么错
V = inv(A);
...
x = V*b;
触发器是对和ø (Ñ 2)为,因此,为了确定用于盈亏平衡值米需要一些试验...inv(A)
V*b
>> 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
有关稳定性和错误分析的信息,请参见对此不同答案的评论,尤其是VictorLiu的评论。
使用Matlab R2011b在12核计算机上执行定时,UNIX平均值平均为5;tic, toc
三个探针的最佳时间。
使用反斜杠或多或少等同于inv(A)*B
,如果您自由编码,则反斜杠可能更直观。它们大致相同(在计算方式上略有不同),尽管您应查看Matlab文档以进行澄清。
要回答您的问题,反斜杠通常可以,但是它确实取决于质量矩阵的属性。
inv(A)
因为仅此一项就比它更昂贵A\b
?