solve(a,a)与solve(a)%*%a结果不同?求解R语言矩阵运算问题
R语言solve()函数结果差异的原因
先看你的代码运行后的实际结果:
a <- matrix(c(1, 2, 1, -1), 2, 2, byrow=T) solve(a, a) # [,1] [,2] # [1,] 1 0 # [2,] 0 1 solve(a) %*% a # [,1] [,2] # [1,] 1.000000e+00 2.220446e-16 # [2,] 0.000000e+00 1.000000e+00
两者看起来有差异,核心原因是浮点数数值计算的精度限制:
solve(a, a)是直接求解线性方程组a %*% x = a,算法内部会针对这种特殊情况(右侧矩阵等于系数矩阵)做优化,直接返回理论上的解——单位矩阵,误差被控制到最小。solve(a)先计算矩阵a的逆矩阵,再通过%*%做矩阵乘法和a相乘。这个过程涉及两次独立的数值运算(求逆+乘法),误差会累积,最终产生接近0的极小值(比如2.220446e-16,这是双精度浮点数的机器epsilon,本质上和0没有区别)。
如果要验证两者是否在数值意义上相等,可以用all.equal()函数:
all.equal(solve(a,a), solve(a)%*%a) # [1] TRUE
这个函数会忽略浮点数的微小误差,判断两者是否实际等价。
内容的提问来源于stack exchange,提问作者Hoseong Jeon
相关产品推荐
相关产品推荐

