如何准确计算矩阵的逆?
How to compute inverse of a matrix accurately?
我正在尝试计算矩阵 P
的逆矩阵,但如果我乘以 inv(P)*P
,MATLAB 不会 return 单位矩阵。这几乎是恒等式(非对角线值 10^(-12)
的顺序)。但是,在我的应用程序中,我需要更高的精度。
遇到这种情况我该怎么办?
仅当您明确需要矩阵的逆时才使用inv()
,否则您只需使用反斜杠运算符\
.
inv()
上的文档明确指出:
x = A\b
is computed differently than x = inv(A)*b
and is recommended for solving systems of linear equations.
这是因为反斜杠运算符或 mldivide()
使用最适合您的特定矩阵的任何方法:
x = A\B
solves the system of linear equations A*x = B
. The matrices A
and B
must have the same number of rows. MATLAB® displays a warning message if A
is badly scaled or nearly singular, but performs the calculation regardless.
为了让您知道 MATLAB 根据您的输入矩阵选择了哪种算法,这里是其文档中提供的完整算法流程图
The versatility of mldivide
in solving linear systems stems from its ability to take advantage of symmetries in the problem by dispatching to an appropriate solver. This approach aims to minimize computation time. The first distinction the function makes is between full (also called "dense") and sparse input arrays.
关于数量级误差 10^(-12)
的旁注,除了上面提到的 inv()
函数的不准确性外,还有浮点精度。 This post on MATLAB issues on it is rather insightful, with a more general computer science post on it here。基本上,如果您正在计算数字,不必担心(至少太多)误差会小 12 个数量级。
你有所谓的病态矩阵。尝试对这样的矩阵求逆是有风险的。一般来说,对除最小矩阵(例如您在线性代数教科书介绍中看到的矩阵)以外的任何矩阵求逆都是有风险的。如果必须,您可以尝试使用 Moore-Penrose 伪逆(参见维基百科),但即使那样也不是万无一失的。
我正在尝试计算矩阵 P
的逆矩阵,但如果我乘以 inv(P)*P
,MATLAB 不会 return 单位矩阵。这几乎是恒等式(非对角线值 10^(-12)
的顺序)。但是,在我的应用程序中,我需要更高的精度。
遇到这种情况我该怎么办?
仅当您明确需要矩阵的逆时才使用inv()
,否则您只需使用反斜杠运算符\
.
inv()
上的文档明确指出:
x = A\b
is computed differently thanx = inv(A)*b
and is recommended for solving systems of linear equations.
这是因为反斜杠运算符或 mldivide()
使用最适合您的特定矩阵的任何方法:
x = A\B
solves the system of linear equationsA*x = B
. The matricesA
andB
must have the same number of rows. MATLAB® displays a warning message ifA
is badly scaled or nearly singular, but performs the calculation regardless.
为了让您知道 MATLAB 根据您的输入矩阵选择了哪种算法,这里是其文档中提供的完整算法流程图
The versatility of
mldivide
in solving linear systems stems from its ability to take advantage of symmetries in the problem by dispatching to an appropriate solver. This approach aims to minimize computation time. The first distinction the function makes is between full (also called "dense") and sparse input arrays.
关于数量级误差 10^(-12)
的旁注,除了上面提到的 inv()
函数的不准确性外,还有浮点精度。 This post on MATLAB issues on it is rather insightful, with a more general computer science post on it here。基本上,如果您正在计算数字,不必担心(至少太多)误差会小 12 个数量级。
你有所谓的病态矩阵。尝试对这样的矩阵求逆是有风险的。一般来说,对除最小矩阵(例如您在线性代数教科书介绍中看到的矩阵)以外的任何矩阵求逆都是有风险的。如果必须,您可以尝试使用 Moore-Penrose 伪逆(参见维基百科),但即使那样也不是万无一失的。