1

Matlab の inv() 操作を使用して逆行列を計算しようとすると、次のようになります。

A = rand(10,10);
b = rand(10,1);

C = inv(A);
D = C*b;

最後の行に次の警告が表示されます: INV は遅く、不正確です。INV(A)*b には A\b を、b*INV(A) には b/A を使用します。

上記のコードを次のように変更できます。

A = rand(10,10);
b = rand(10,1);

C = inv(A);
D = A\b;

警告は表示されなくなりましたが、この解決策の方が優れているとは思いません。

注:行列 A の逆行列と inv(A)*c の両方を格納する必要があります。また、私の実際のファイルでは、行列 A のサイズは 5000 x 5000 またはそれ以上になる可能性があります。

効率と精度の点でより良い解決策はありますか、それとも最初の方法で問題ありませんか?

4

3 に答える 3

3

後で逆数が絶対に必要な場合は、それを計算する必要があります。\後で逆の代わりにバックスラッシュ演算子 ( ) を使用できる場合は、逆から離れて、MATLAB の提案に耳を傾けます。数値的な理由から、可能な場合は常にスラッシュ演算子を使用することをお勧めします。そのため、遅くても 2 番目の方法の方が優れています。

于 2013-05-14T14:29:25.773 に答える
3

Matlab を聞いて、2 番目のオプションを使用する必要があります。内部でさまざまなアルゴリズムを使用して計算されており、inv(A)*b実際にはより正確です。A\b\

状態のドキュメントinv:

実際には、行列の明示的な逆行列を作成する必要はほとんどありません。線形連立方程式 Ax = b を解くときに、inv が頻繁に誤用されます。これを解決する 1 つの方法は、x = inv(A)*b を使用することです。実行時間と数値精度の両方の観点から、より良い方法は、行列除算演算子 x = A\b を使用することです。これにより、逆行列を形成せずに、ガウス消去法を使用して解が生成されます。詳細については、mldivide () を参照してください。

于 2013-05-14T14:30:19.870 に答える