回答:
あなたができる最も明白なことは、事前計算することです
[L,U] = lu(A)
〜O(n ^ 3)
次に計算するだけです
x = U \ (L \ b)
〜O(2 n ^ 2)
これにより、コストが大幅に削減され、高速化されます。精度は同じです。
L\b
。私はこの正確な行が高性能コードで私が専門家と考える人々によって使用されているのを見たので。
仮定あるのn × nは密行列、あなたが解決しなければならAをxは、私は = bの私、私は= 1 ... メートルを。場合は、mがある十分に大きい、その後何も間違っているではあり
V = inv(A);
...
x = V*b;
フロップは for およびO (n 2) forです。したがって、mの損益分岐値を決定するには、いくつかの実験が必要です。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
この些細な例では、m > 125の場合、事前計算がL Uの前方および後方解よりも優れています。
安定性とエラー分析については、この異なる回答、特にVictorLiuの回答に対するコメントを参照してください。
提案されたタイミングはまったく「科学的」ではありませんが、関連するLAPACKおよびBLASサブルーチンを呼び出すことでCまたはFortranで実装された場合、Milind R の回答で提案されたアプローチは完全に理にかなっていることを示すことを意味するさえは、MATLABに有効。
5のほぼ一定のUNIX負荷平均で、12コアコンピューターでMatlab R2011bを使用してタイミングを実行しました。tic, toc
3つのプローブのベストタイム。
バックスラッシュの使用は、とほぼ同等inv(A)*B
ですが、自由にコーディングする場合は、後者の方がより直感的です。これらはほぼ同じです(計算の実行方法が異なる)が、明確にするためにMatlabのドキュメントを確認する必要があります。
あなたの質問に答えるために、バックスラッシュは一般に問題ありませんが、質量行列の特性に依存します。
inv(A)
それだけで計算するよりも高価なのですA\b
か?