You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何用NumPy将矩阵与其逆矩阵相乘无法得到单位矩阵?

为什么矩阵乘其“逆矩阵”得不到单位矩阵?

嘿,你遇到的问题其实不是浮点舍入误差——而是你的矩阵根本没有逆矩阵!

先看你用的矩阵:

C = np.array([[5,5,5],[4,5,6],[7,8,9]])

我们可以先计算它的行列式来验证:

import numpy as np
print(np.linalg.det(C))

运行后你会得到一个非常接近0的数值(比如-2.6645352591003757e-15),这说明这是一个奇异矩阵——矩阵的行/列线性相关,不存在真正的逆矩阵。

手动计算行列式也能确认这一点:

5*(5*9 - 6*8) -5*(4*9 -6*7) +5*(4*8 -5*7)
=5*(45-48) -5*(36-42)+5*(32-35)
=5*(-3) -5*(-6)+5*(-3)
=-15 +30 -15 =0

行列式为0,矩阵自然不可逆。

那为什么np.linalg.inv(C)会返回一堆超大的数值?这是因为numpy默认不会对奇异矩阵直接报错,而是尝试进行数值计算,结果会出现严重的数值不稳定,得到的是一个没有实际意义的近似值,根本不是真正的逆矩阵,所以你用原矩阵乘它,自然得不到单位矩阵。

怎么处理这种情况?

如果你的场景需要对奇异矩阵做类似逆矩阵的操作,可以使用伪逆矩阵,用np.linalg.pinv(C)来计算,它是在最小二乘意义下的最优近似逆:

import numpy as np

C = np.array([[5,5,5],[4,5,6],[7,8,9]])
print("原始矩阵")
print(C)
print("伪逆矩阵")
D_pinv = np.linalg.pinv(C)
print(D_pinv)
print("原矩阵乘伪逆矩阵")
print(C.dot(D_pinv))

运行后你会得到一个投影矩阵,这是伪逆的特性——它无法让原矩阵乘后得到单位矩阵,但能满足很多近似计算的需求。

总结一下:

  • 你的矩阵是奇异矩阵(行列式为0),不存在真正的逆矩阵
  • np.linalg.inv对奇异矩阵的计算结果是数值不稳定的无效值,不是真正的逆
  • 若需要处理奇异矩阵,使用伪逆np.linalg.pinv更合适

内容的提问来源于stack exchange,提问作者Chase Brumfield

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:55:47