使用numpy的SVD方法求3×2矩阵的逆时输出维度不符问题求解
SVD求非方阵伪逆问题修正
问题根源
你的代码存在4处核心错误,直接导致维度不符合预期:
- 混淆了逐元素乘法和矩阵乘法:numpy中
*是逐元素相乘,会触发广播机制,不同维度数组运算后会生成高维数组,矩阵乘法需用@运算符或np.matmul()/np.dot()。 - 未对奇异值数组做正确处理:
np.linalg.svd返回的s是一维数组,你需要先对每个奇异值取倒数,再构造为对应形状的对角伪逆矩阵,直接转置一维s没有任何作用。 - 伪逆计算顺序错误:SVD分解公式为 $R = U \Sigma V^H$,对应的 Moore-Penrose 伪逆公式为 $R^+ = V \Sigma^+ U^H$,你的相乘顺序完全不符合公式要求。
- 输入数组
A的维度不符合要求:你给出的A默认是一维数组形状为(2,),而非你预期的(2,1),直接参与矩阵运算会触发维度不匹配。
修正后可运行代码
import numpy as np # 定义输入矩阵R R = np.array([ [190.93095651, 189.30517758], [187.01785506, 185.38861727], [183.29225361, 181.47205695] ]) # SVD分解 u, s, vh = np.linalg.svd(R, full_matrices=True) # 构造Σ的伪逆矩阵:形状为(2,3) s_inv = np.diag(1 / s) s_inv_full = np.zeros((2, 3)) s_inv_full[:, :2] = s_inv # 计算伪逆Rv,形状为(2,3),符合预期 Rv = vh.T @ s_inv_full @ u.T # 定义数组A并调整为(2,1)形状 A = np.array([-0.20434669, -0.20225446]).reshape(2, 1) # 矩阵相乘得到形状为(3,1)的结果 res = Rv.T @ A print(res.shape) print(res)
补充说明
如果不需要手动实现SVD求伪逆的逻辑,可以直接调用numpy封装好的np.linalg.pinv(R)获取伪逆矩阵,结果和手动计算完全一致,代码更简洁。
内容的提问来源于stack exchange,提问作者Esalah
相关产品推荐
相关产品推荐

