poster
2019-12-14, 20:13
在MATLAB中计算某些方阵A的逆时,使用
Ai = inv(A) % should be the same as: Ai = A^-1 MATLAB通常会通知我这不是最有效的反转方法。那么更有效率吗?如果我有一个方程式系统,则可能使用/,\运算符。但是有时候我需要逆运算来进行其他计算。
反转的最有效方法是什么?
回答:
我建议使用svd (除非您确实完全确定您的矩阵没有病态)。然后,基于奇异值,您可以决定要采取的其他措施。这听起来像是一种“过度杀伤”的方法,但从长远来看,它将得到回报。
现在,如果矩阵A实际上是可逆的,则A的pseudo inverse与inv(A)一致,但是,如果您接近“奇点”,您将轻松地做出适当的决定,如何继续进行实际的pseudo inverse 。当然,这些决定将取决于您的应用程序。
添加了一个简单的示例:
> A= randn(3, 2); A= [AA(:, 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
更多&回答... (https://stackoverflow.com/questions/5004148)
Ai = inv(A) % should be the same as: Ai = A^-1 MATLAB通常会通知我这不是最有效的反转方法。那么更有效率吗?如果我有一个方程式系统,则可能使用/,\运算符。但是有时候我需要逆运算来进行其他计算。
反转的最有效方法是什么?
回答:
我建议使用svd (除非您确实完全确定您的矩阵没有病态)。然后,基于奇异值,您可以决定要采取的其他措施。这听起来像是一种“过度杀伤”的方法,但从长远来看,它将得到回报。
现在,如果矩阵A实际上是可逆的,则A的pseudo inverse与inv(A)一致,但是,如果您接近“奇点”,您将轻松地做出适当的决定,如何继续进行实际的pseudo inverse 。当然,这些决定将取决于您的应用程序。
添加了一个简单的示例:
> A= randn(3, 2); A= [AA(:, 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
更多&回答... (https://stackoverflow.com/questions/5004148)