7

MATLAB で正方行列 A の逆行列を計算する場合、

Ai = inv(A)
% should be the same as:
Ai = A^-1

MATLAB は通常、これが最も効率的な反転方法ではないことを通知します。では、より効率的なものは何ですか?私が方程式系を持っている場合、/、\ 演算子を使用するのはおそらくそうです。しかし、他の計算のために逆数が必要になることがあります。

反転する最も効率的な方法は何ですか?

4

4 に答える 4

11

使用することをお勧めしますsvd(マトリックスが悪条件になっていないことが本当に確実でない限り)。次に、特異値に基づいて、実行するアクションについて決定を下します。これは「やり過ぎ」のアプローチのように聞こえるかもしれませんが、長期的には見返りがあります。

これで、行列Aが実際に可逆である場合は、pseudo inverseA一致しinv(A)ますが、「特異点」に近い場合は、実際にを作成する方法を簡単に適切に決定できますpseudo inverse。当然、これらの決定はアプリケーションによって異なります。

簡単な例を追加しました:

> A= randn(3, 2); A= [A A(:, 1)+ A(:, 2)]
A =
  -1.520342  -0.239380  -1.759722
   0.022604   0.381374   0.403978
   0.852420   1.521925   2.374346

> inv(A)
warning: inverse: matrix singular to machine precision, rcond = 0
ans =
   Inf   Inf   Inf
   Inf   Inf   Inf
   Inf   Inf   Inf

> [U, S, V]= svd(A)
U =
  -0.59828  -0.79038   0.13178
   0.13271  -0.25993  -0.95646
   0.79022  -0.55474   0.26040

S =
Diagonal Matrix
  3.6555e+000            0            0
            0  1.0452e+000            0
            0            0  1.4645e-016

V =
   0.433921   0.691650   0.577350
   0.382026  -0.721611   0.577350
   0.815947  -0.029962  -0.577350

> s= diag(S); k= sum(s> 1e-9) % simple thresholding based decision
k =  2

> Ainv= (U(:, 1: k)* diag(1./ s(1: k))* V(:, 1: k)')'
Ainv =
  -0.594055  -0.156258  -0.273302
   0.483170   0.193333   0.465592
  -0.110885   0.037074   0.192290

> A* Ainv
ans =
   0.982633   0.126045  -0.034317
   0.126045   0.085177   0.249068
  -0.034317   0.249068   0.932189

> A* pinv(A)
ans =
   0.982633   0.126045  -0.034317
   0.126045   0.085177   0.249068
  -0.034317   0.249068   0.932189
于 2011-02-15T15:36:25.100 に答える