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

numpy QR分解后求逆报数组末两维需为方阵错误解决方法

修复方案

你触发报错的核心原因是选择'complete'模式做QR分解时,对于3行2列的非方阵输入A,返回的r是3×2的非方阵,自然无法直接求逆。你要实现的是通过QR分解计算A的摩尔-彭若斯伪逆,和(A.T @ A)^{-1} @ A.T数学等价,不需要使用全尺寸的QR分解结果,两种可行修复方式如下:

方案1:使用经济型QR分解(推荐)

将QR分解的模式从'complete'改为'reduced'(经济型分解),此时返回的r是和A列数维度一致的上三角方阵,q是列正交矩阵,直接沿用你的原有计算逻辑即可正常运行:

import numpy as np
A = np.array([[2,-1],[-1,2],[0,-1]])
# 经济型QR分解,r为2×2可逆方阵
q, r = np.linalg.qr(A, 'reduced')

print("q矩阵:")
print(q)
print("r矩阵:")
print(r)

# 可正常运行,结果与伪逆公式完全一致
print("QR法计算的伪逆:")
print(np.dot(np.linalg.inv(r), q.T))
print("公式法计算的伪逆:")
print(np.dot(np.linalg.inv(np.dot(A.T, A)), A.T)) 

方案2:截取complete模式结果的有效子块

如果你已经拿到了'complete'模式的分解结果不想重新计算,只需要截取有效部分即可:complete模式下r的后m-n行(这里m是A的行数,n是A的列数)全为0,q的后m-n列对应A的左零空间,二者对伪逆计算没有贡献,截取前n行n列的r、前n列的q即可:

import numpy as np
A = np.array([[2,-1],[-1,2],[0,-1]])
q, r = np.linalg.qr(A, 'complete')
n = A.shape[1]
# 截取有效子块
r_valid = r[:n, :n]
q_valid = q[:, :n]

# 正常计算
print(np.dot(np.linalg.inv(r_valid), q_valid.T))

注意:实际工程数值计算中,不推荐直接使用np.linalg.inv求逆后做矩阵乘法,针对上三角矩阵r,使用三角矩阵专用的线性方程组求解函数计算伪逆,数值稳定性会高很多,不过这属于优化项,不影响当前代码逻辑跑通。

内容的提问来源于stack exchange,提问作者Zhe Wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:24:17