MATLAB 中 inv() 和 pinv() 函数之间的区别

2025 年 7 月 26 日 | 7 分钟阅读

引言

矩阵是MATLAB中一项核心操作,MATLAB是一款专门用于处理线性代数运算的数值软件。在不同的工程、物理和数据科学领域,矩阵被用来描述系统、消元和分析数据。在这些操作中,矩阵求逆是解决线性系统、进行变换和构建其他高级运算的最重要操作之一。

MATLAB 中的矩阵运算

由于MATLAB创建了一个强大的计算环境,因此在 MATLAB 中进行 矩阵操作 非常容易且准确。该平台还包含许多与矩阵相关的运算,如加法、乘法、转置和求逆。这些运算都经过高度优化以提高性能。这就是为什么MATLAB在各大院校和行业中得到广泛应用的原因。

矩阵求逆在计算应用中的重要性

  • 控制系统: 在设计控制器和状态估计器时,可能会遇到涉及矩阵求逆的方程。
  • 信号处理: 滤波和重建工作大部分时间依赖于矩阵的逆来获得最佳性能。
  • 优化问题: 许多优化方法依赖于矩阵求逆来以最佳方式解决问题。
  • 机器学习: 例如,线性回归 需要使用矩阵求逆来计算模型参数。

函数定义

inv() 函数

inv() 是MATLAB函数之一,用于计算特定方阵和非奇异矩阵的逆。矩阵A的倒数是另一个矩阵,记作A−1,使得当两者相乘时,它们的乘积得到单位矩阵I,即 A⋅A−1=I。在求解线性方程组时,始终需要了解,当系数矩阵是 方阵 且满秩时,inv() 函数起着核心作用。

inv() 函数适用于方阵 代数表达式,只要这些表达式是非奇异矩阵。事实上,当输入矩阵满足特定要求时,它会提供直接的数学反向结果。然而,它不适用于奇异矩阵或非方阵,因为这些矩阵不存在精确的逆。

语法

其中

  • A 被称为输入矩阵,它必须是方阵,即行数等于列数,并且必须是非奇异的(矩阵的行列式不为0)。

示例

输出

A_inv =
   3.0000  -1.0000
  -5.0000   2.0000

pinv() 函数

在MATLAB中,pinv() 函数用于计算矩阵的摩尔-彭罗斯伪逆。与inv() 函数不同,pinv() 函数同时支持方阵和矩形矩阵,并且也支持 奇异矩阵。伪逆在某些情况下是接近逆的,因为在某些情况下不存在真正的逆,而在其他情况下,矩阵甚至不是方阵。

语法

其中

  • A 是一个中间结果矩阵,它可以是方阵、矩形矩阵或奇异矩阵。该函数首先使用奇异值分解 (SVD) 来计算伪逆。

示例

输出

B_pinv =
   -3.0000   1.7500  -0.2500
    2.0000  -1.0000   0.0000

inv() 和 pinv() 在 MATLAB 中的主要区别

支持的矩阵类型

  • inv(): MATLAB 的 inv() 函数仅对非奇异方阵执行求逆运算。上述定义中的一般性解决方案表明,矩阵 A 必须是方阵,且其行列式非零。如果未能满足所有这些条件,inv() 函数将返回错误,或者无法找到逆。

示例

  • pinv(): pinv() 函数是通用的,适用于方阵和矩形矩阵。它可以处理奇异矩阵、行数多于列数的矩阵(超定)和行数少于列数的矩阵(欠定)。因此,可以说 pinv() 在处理各种数学和工程问题方面比 inv() 更通用。

示例

目的和用途

  • inv(): 通常,inv() 最重要的用途是获得二阶矩阵的精确逆。它主要用于求解形式为 AX=B 的线性方程组,其中 A 是非奇异方阵。通过 inv(A)∗B = X 也可以得到精确解。

示例

  • pinv(): pinv() 函数计算矩阵 A 的摩尔-彭罗斯伪逆,在矩阵 A 没有唯一逆(如奇异矩阵或非方阵)时非常有用。它广泛用于最小二乘解,即当寻求矩阵方程 AX=B 的近似解时。

示例

数值稳定性

  • inv(): 这表明 inv() 函数在数值上不稳定,尤其对于病态矩阵,输入矩阵的微小变化会导致计算出的逆发生巨大变化。这种不稳定性使其不太适合实际应用,例如处理病态矩阵。

示例

  • pinv(): pinv() 函数通过行均衡来高效地解决病态矩阵问题,而不是依赖于 SVD。它减小了数值误差的影响,这意味着在这种情况下它更稳定。

示例

计算方法

  • inv(): inv() 函数直接处理 AX=I 系统,其指示器使用假设 A 是方阵且非奇异的方法进行估计。
  • pinv(): pinv() 函数涉及使用奇异值分解 SVD,这是一种计算伪逆的方法。A 的 SVD 是 A=UΣVT 的真分解,其中 U 和 V 是正交矩阵,Σ 是对角矩阵,通过替换 Σ 的非零元素的倒数来形成广义逆。

应用场景

  • inv(): 仅当可行集由 AX=B 系统定义时才是必需且有用的,其中 A 是行列式非零的方阵。但是,应谨慎使用它来直接计算逆,因为这是一个昂贵的操作,并且效率不如使用反斜杠运算符。

示例

  • pinv(): 通常用于超定系统(方程数量多于未知数数量)和欠定系统(方程数量少于未知数数量)。它也用于信号处理、机器学习 和控制系统,以获得最佳近似结果。

示例

MATLAB 中的实际示例:inv() vs. pinv()

1. 使用 inv() 处理方阵

inv() 函数用于计算非奇异方阵的精确逆。

输出

  • inv() 成功计算了矩阵 A 的逆。
  • A 及其逆的乘积得到单位矩阵。

2. 使用 pinv() 处理奇异矩阵和矩形矩阵

pinv() 是一个计算摩尔-彭罗斯逆的函数,适用于奇异矩阵和非方阵。

示例 2.1:奇异矩阵

输出

  • inv() 无法工作,因为它涉及 B,而 B 是奇异的,因为 B 的行列式为 0。
  • pinv() 是一个鲁棒的伪逆,能够给出合理的解。

示例 2.2:矩形矩阵

输出

  • pinv() 可以处理矩形矩阵,并附加一个合适的伪逆以供进一步计算。

3. pinv() 优于 inv() 的使用场景

示例 3.1:求解超定系统

在超定线性方程组(方程数量大于未知数数量)的情况下,pinv() 可以提供最小二乘解。

示例 3.2:求解病态系统

对于接近奇异的矩阵(病态矩阵),pinv() 比其他求解方法更有效。

输出

  • pinv() 降低了 inv() 在处理病态矩阵时出现的数值病态问题。

下一主题MATLAB 极限