在matlab中,A \ B
会给出一个特殊解,而numpy.linalg.lstsq则不会。
A = [1 2 0; 0 4 3];
b = [8; 18];
c_mldivide = A \ b
c_mldivide =
0
4
0.66666666666667
c_lstsq = np.linalg.lstsq([[1 ,2, 0],[0, 4, 3]],[[8],[18]])
print c_lstsq
c_lstsq = (array([[ 0.91803279],
[ 3.54098361],
[ 1.27868852]]), array([], dtype=float64), 2, array([ 5.27316304,1.48113184]))
- mldivide在matlab中如何提供特殊解?
- 这个解对于实现计算精度有用吗?
- 为什么这个解很特殊,你如何在numpy中实现它?
[0.918 3.541 1.279]
)也是正确的解。您有3个未知数的2个方程,因此没有唯一的解。解为任何实数s
的[-1 9/2 0]+s*[3/2 -3/4 1]
。将s=2/3
用于Matlab解,将s=1.27868852
用于Python解。 - DavidA\b
解法与numpy
相同。MATLAB文档建议使用计算成本更高的方法pinv(A)*B
。在Octave中,这也会产生相同的结果。numpy
也有pinv
,结果相同。 - hpauljlstsq
返回具有最小范数的解;即,具有变量平方和最小的解。这是一种可以描述为“最小二乘”的东西,尽管“最小范数”是一个更可取的术语,以避免混淆。 - user3717023