Skip to content

MATLAB - 矩阵求逆

在线性代数中,方阵 A 的逆矩阵,记作 A⁻¹,是一个满足以下关系的矩阵:

A * A⁻¹ = A⁻¹ * A = I
(where I is the identity matrix)

一个矩阵必须是方阵(行数和列数相等)且非奇异才能有逆矩阵。如果矩阵的行列式为零,则称该矩阵为奇异矩阵。非奇异矩阵也称为可逆矩阵。

在 MATLAB 中,您可以使用 inv() 函数计算矩阵的逆。矩阵 A 的逆矩阵即为 inv(A)。

创建一个脚本文件并输入以下代码以定义一个矩阵并计算其逆矩阵。

% Define a 3x3 square matrix
A = [1, 4, 2;
2, 5, 1;
3, 6, 0];
% Calculate the inverse of A
A_inv = inv(A);
% Display the original and inverted matrices
disp('Original Matrix A:');
disp(A);
disp('Inverse Matrix A_inv:');
disp(A_inv);
% Verification: A * A_inv should be the identity matrix
identity_check = A * A_inv;
disp('Verification (A * A_inv):');
disp(identity_check);

运行此脚本时,它将显示以下结果。请注意,由于浮点运算,验证矩阵可能包含非常小的非零值,而不是完美的零。

Original Matrix A:
1 4 2
2 5 1
3 6 0
Inverse Matrix A_inv:
-2.0000 4.0000 -2.0000
1.0000 -2.0000 1.0000
-1.0000 2.0000 -1.0000
Verification (A * A_inv):
1.0000 0 0
0 1.0000 0
-0.0000 -0.0000 1.0000

最佳实践:不使用 inv() 求解线性系统

Section titled “最佳实践:不使用 inv() 求解线性系统”

矩阵求逆的一个常见用途是求解形式为 Ax = b 的线性方程组。虽然数学上将 x = A⁻¹b 视为正确,但这不是在 MATLAB 或任何数值计算环境中推荐的求解方式。

与使用反斜杠运算符 (“) 进行矩阵除法相比,使用 inv(A) 计算显式逆矩阵的计算成本更高,且通常精度较低。

让我们求解 Ax = b 系统,其中 A 是我们之前的矩阵,b 是一个列向量。

% Define the same matrix A
A = [1, 4, 2; 2, 5, 1; 3, 6, 0];
% Define the vector b
b = [6; 7; 6];
% --- Inefficient Method ---
% Using the inverse function
x_inefficient = inv(A) * b;
% --- Recommended Method ---
% Using the backslash operator (matrix left division)
x_efficient = A \ b;
disp('Solution using inv(A)*b:');
disp(x_inefficient);
disp('Solution using A\b:');
disp(x_efficient);

对于这个简单案例,两种方法都产生相同的结果,但反斜杠运算符更健壮、更高效,特别是对于大型矩阵。它使用不同的算法(如 LU 分解),这些算法经过优化,可直接求解系统。

Solution using inv(A)*b:
2.0000
1.0000
-1.0000
Solution using A\b:
2.0000
1.0000
-1.0000

如果矩阵的行列式为零,则该矩阵的逆不存在。您可以使用 det() 函数检查行列式。

A_singular = [1, 2; 2, 4];
det_A_singular = det(A_singular);
disp(['Determinant of A_singular is: ', num2str(det_A_singular)]);
% 尝试对奇异矩阵求逆将导致警告。
% inv(A_singular)

在实践中,数值问题意味着行列式可能是一个非常接近零的极小值,而不是精确的零。检查矩阵是否接近奇异(即病态)的更好方法是使用 cond() 函数计算条件数。条件数非常大表示矩阵是病态的,Ax=b 的解可能不准确。

cond_A = cond(A);
cond_A_singular = cond(A_singular);
disp(['Condition number of A: ', num2str(cond_A)]);
disp(['Condition number of A_singular: ', num2str(cond_A_singular)]);

输出将显示我们行为良好的矩阵 A 的条件数较小,而奇异矩阵 A_singular 的条件数非常大(或 Inf)。

  • 错误:矩阵必须是方阵。 如果您尝试对非方阵使用 inv(),则会发生此错误。逆矩阵仅为方阵定义。
  • 警告:矩阵接近奇异或缩放不良。 当您对奇异或病态矩阵使用 inv() 或 “ 时,会出现此警告。结果可能不可靠。如果您怀疑这种情况,请务必使用 cond() 检查条件数。
  • 乘法维度不正确: 在求解 Ax=b 时,请确保 A 的行数与 b 中的元素数量匹配。