我们知道A*B*C = A*(B*C)
,但为什么这个矩阵乘法会得到不同的结果?
import numpy as np
A = np.array([[1,2,3],[4,5,6]])
B = np.array([[1,2,3],[4,5,6],[7,8,9]])
print( A.dot( np.linalg.inv(B) ).dot(A.T) )
print( A.dot( np.linalg.inv(B).dot(A.T) ) )
结果是
[[ 0.5 2. ]
[ 1. 4. ]]
和
[[ 2. 4.]
[ 8. 16.]]
答案 0 :(得分:3)
if (test == static_cast<int16_t>(0xFFFE)) {
排名不足以取得逆转。要获得至少一致的结果,请使用B
作为伪逆。
np.linalg.pinv
np.linalg.matrix_rank(B)
# we want 3
# we got 2
2
答案 1 :(得分:3)
浮点算术运算不关联。通常我们没有注意到这一点,因为矩阵A*(B*C)
和(A*B)*C
之间的数值差异很小。但在这种情况下,你试图反转Numpy实际上试图做的不可逆矩阵B,得到一些荒谬的结果:
[[ 3.15251974e+15 -6.30503948e+15 3.15251974e+15]
[ -6.30503948e+15 1.26100790e+16 -6.30503948e+15]
[ 3.15251974e+15 -6.30503948e+15 3.15251974e+15]]
这些数字的大小是这样的,在双精度水平上可以预期大小为1的误差(你得到大约16个准确的数字)。由于大量的消除,A和A.T的乘法使矩阵变回小的东西。但是当非常大的数字相互抵消时,相对误差会增大;结果最终变得毫无意义。