C++实现Moore-Penrose伪逆计算结果与MATLAB预期不符求助
代码问题排查结果
核心问题1:矩阵维度配置错误
代码开头宏定义#define N 7,但你需要计算的是4×4矩阵的伪逆,所有矩阵运算逻辑都基于N=7执行,和你的输入矩阵维度完全不匹配。
核心问题2:输入矩阵未初始化到一维数组
你写了Trans_2D_1D函数负责把二维输入矩阵转成一维存储格式,但main函数里完全没有调用这个函数,你用于运算的matrix指针是new出来的未初始化内存,存储的都是随机垃圾值,后续转置、矩阵乘法的结果自然都是错误的。
核心问题3:行列式函数精度丢失
determinant函数的返回值类型是int,但矩阵元素是浮点型,计算得到的行列式如果是小数会被强制截断为整数,很容易出现本来行列式非0,被截断后变成0的情况,导致误判矩阵奇异。
核心问题4:伪逆实现逻辑适用范围有限
你用的伪逆计算公式A⁺ = (AᵀA)⁻¹Aᵀ仅适用于列满秩的矩阵,你的输入矩阵第一行全为0,本身是奇异矩阵,AᵀA也必然是奇异矩阵,直接求逆当然会失败。MATLAB的pinv是基于SVD(奇异值分解)实现的,对秩亏矩阵也能计算出正确的伪逆,你当前的实现逻辑无法处理秩亏场景。
临时修复步骤(仅适用于满秩矩阵场景)
- 把宏定义改为
#define N 4 - 在
main函数里Transpose调用之前,添加Trans_2D_1D(A, matrix);完成输入矩阵的初始化 - 把
determinant函数的返回值类型改为float,所有涉及行列式计算的变量都改为浮点类型
内容的提问来源于stack exchange,提问作者CodingCurry
相关产品推荐
相关产品推荐

