MATLAB で正方行列 A の逆行列を計算する場合、
Ai = inv(A)
% should be the same as:
Ai = A^-1
MATLAB は通常、これが最も効率的な反転方法ではないことを通知します。では、より効率的なものは何ですか?私が方程式系を持っている場合、/、\ 演算子を使用するのはおそらくそうです。しかし、他の計算のために逆数が必要になることがあります。
反転する最も効率的な方法は何ですか?
MATLAB で正方行列 A の逆行列を計算する場合、
Ai = inv(A)
% should be the same as:
Ai = A^-1
MATLAB は通常、これが最も効率的な反転方法ではないことを通知します。では、より効率的なものは何ですか?私が方程式系を持っている場合、/、\ 演算子を使用するのはおそらくそうです。しかし、他の計算のために逆数が必要になることがあります。
反転する最も効率的な方法は何ですか?
使用することをお勧めしますsvd
(マトリックスが悪条件になっていないことが本当に確実でない限り)。次に、特異値に基づいて、実行するアクションについて決定を下します。これは「やり過ぎ」のアプローチのように聞こえるかもしれませんが、長期的には見返りがあります。
これで、行列A
が実際に可逆である場合は、pseudo inverse
とA
一致し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