为何NumPy计算特定矩阵的逆矩阵返回错误结果?
问题原因与解决办法
核心问题:你用的是奇异矩阵(根本不可逆)
你给出的矩阵:
[[1 2 3] [4 5 6] [7 8 9]]
计算它的行列式会得到0(可以用np.linalg.det(a)验证),线性代数里明确规定:行列式为0的矩阵不存在逆矩阵。
为啥NumPy会输出一堆超大数?
NumPy的np.linalg.inv不会预先判断矩阵是否可逆,直接执行数值计算。碰到奇异矩阵时,数值计算会出现数值不稳定,直接输出超大的错误值——这不是NumPy的bug,是矩阵本身不满足可逆的前提条件。
另外你提到的“正确逆矩阵”是错误的:你可以手动验证,那个矩阵和原矩阵相乘根本得不到单位矩阵,不存在这样的逆矩阵。
怎么判断矩阵能不能逆?
- 计算行列式:
np.linalg.det(a),结果接近0(考虑浮点误差)就说明矩阵不可逆。 - 计算矩阵的秩:
np.linalg.matrix_rank(a),如果秩小于矩阵的阶数(这里是3),则矩阵不可逆。你的矩阵秩为2,明显小于3,肯定逆不了。
要是非得处理这个矩阵怎么办?
如果是要解线性方程组或者做类似操作,别硬求逆,改用以下两种方法:
- 最小二乘解:
np.linalg.lstsq(a, b, rcond=None),适合处理超定或奇异系统,求解最优近似解。 - 伪逆矩阵:
np.linalg.pinv(a),这是奇异矩阵的广义逆,满足a @ pinv(a) @ a = a,虽然不是严格意义上的逆,但很多场景下可以替代使用。
伪逆的示例代码:
import numpy as np a = np.array([[1,2,3],[4,5,6],[7,8,9]]) pinv_a = np.linalg.pinv(a) print(pinv_a)
输出结果的数值和你之前误以为的“正确逆矩阵”一致,但要明确这是伪逆,不是真的逆矩阵。
怎么避免踩坑?
- 求逆之前先检查行列式或秩,确认矩阵可逆再计算。
- 处理未知矩阵时,优先考虑伪逆或最小二乘方法,而非直接求逆,避免碰到奇异矩阵导致数值崩溃。
内容的提问来源于stack exchange,提问作者Hummingbee
相关产品推荐
相关产品推荐

