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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:36:03