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
相关产品推荐
相关产品推荐

