pinv
摩尔-彭罗斯伪逆
说明
示例
使用伪逆求解线性方程组
比较通过反斜杠 (\
)、pinv
和 lsqminnorm
求得的线性方程组的解。
如果矩形系数矩阵 A
低秩,则使 norm(A*x-b)
最小化的最小二乘问题将有无限多个解。x1 = A\b
和 x2 = pinv(A)*b
返回两个解。这两个解具有以下特征:x1
只有 rank(A)
个非零分量,norm(x2)
是小于任何其他解的范数。
创建一个 rank(A) = 3
的 8×6 矩阵。
A = magic(8); A = A(:,1:6)
A = 8×6
64 2 3 61 60 6
9 55 54 12 13 51
17 47 46 20 21 43
40 26 27 37 36 30
32 34 35 29 28 38
41 23 22 44 45 19
49 15 14 52 53 11
8 58 59 5 4 62
为方程组的右侧创建一个向量。
b = 260*ones(8,1)
b = 8×1
260
260
260
260
260
260
260
260
为右侧选择的数字 260 是 A
的 8×8 幻数和。如果 A
仍然是 8×8 矩阵,则 x 有一个解是由 1 组成的向量。如果只有六列,方程仍然是一致的,因为仍然存在解,但解并非全部由 1 组成。由于矩阵低秩,因此有无限多个解。
使用反斜杠和 pinv
求两个解。
x1 = A\b
Warning: Rank deficient, rank = 3, tol = 1.882938e-13.
x1 = 6×1
3.0000
4.0000
0
0
1.0000
0
x2 = pinv(A)*b
x2 = 6×1
1.1538
1.4615
1.3846
1.3846
1.4615
1.1538
从 norm(A*x1-b)
和 norm(A*x2-b)
仅存在舍入误差的意义上来说,这两个解都是精确的。解 x1
的特殊之处在于它只有三个非零元素。解 x2
的特殊之处在于 norm(x2)
小于其他任何解的对应值,包括 norm(x1)
。
norm(x1)
ans = 5.0990
norm(x2)
ans = 3.2817
使用 lsqminnorm
计算此问题的最小二乘解会产生与使用 pinv
相同的解。lsqminnorm(A,b)
通常比 pinv(A)*b
更高效。
x3 = lsqminnorm(A,b)
x3 = 6×1
1.1538
1.4615
1.3846
1.3846
1.4615
1.1538
norm(x3)
ans = 3.2817
输入参数
A
— 输入矩阵
矩阵
输入矩阵。
数据类型: single
| double
复数支持: 是
tol
— 奇异值容差
标量
奇异值容差,指定为标量。在计算伪逆时,pinv
会将小于或等于 tol
的奇异值视为零。
默认容差是 max(size(A))*eps(norm(A))
。
示例: pinv(A,1e-4)
详细信息
摩尔-彭罗斯伪逆
摩尔-彭罗斯伪逆是一种矩阵,可在不存在逆矩阵的情况下作为逆矩阵的部分替代。此矩阵常被用于求解没有唯一解或有许多解的线性方程组。
对于任何矩阵 A
来说,伪逆 B
都存在,是唯一的,并且具有与 A'
相同的维度。如果 A
是方阵且非奇异,则 pinv(A)
只是一种成本比较高的计算 inv(A)
的方式。但是,如果 A
不是方阵,或者是方阵且奇异,则 inv(A)
不存在。在这些情况下,pinv(A)
拥有 inv(A)
的部分(但非全部)属性:
此处,AB 和 BA 是埃尔米特矩阵。伪逆计算基于 svd(A)
。该计算将小于或等于 tol
的奇异值视为零。
提示
您可以将应用于向量
b
的大部分pinv
(比如在pinv(A)*b
中)替换为lsqminnorm(A,b)
,以计算线性方程组的最小范数最小二乘解。例如,在 使用伪逆求解线性方程组 中,lsqminnorm
产生与pinv
相同的解。lsqminnorm
通常比pinv
更高效,因为lsqminnorm
使用A
的完全正交分解来寻找其低秩逼近,并将其因子应用于b
。相比之下,pinv
使用奇异值分解来显式形成A
的伪逆,然后必须乘以b
。lsqminnorm
也支持稀疏矩阵。
算法
pinv
通过奇异值分解来形成 A
的伪逆。S
对角线上小于或等于 tol
的奇异值被视为零,而 A
的表示变成:
因此 A
的伪逆等于:
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
代码生成不支持对此函数使用稀疏矩阵输入。
GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。
请参考“C/C++ 代码生成”一节中的用法说明和限制。同样的限制也适用于 GPU 代码生成。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
此函数完全支持 GPU 数组。有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
版本历史记录
在 R2006a 之前推出R2021b: pinv
在输入为非有限时返回 NaN
当输入包含非有限值(Inf
或 NaN
)时,pinv
返回 NaN
值。以前,pinv
在输入包含非有限值时会引发错误。
另请参阅
inv
| qr
| rank
| svd
| lsqminnorm
| decomposition
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)