我正在尝试实现rabin的信息分散算法,该算法涉及将NxM
矩阵乘以文件。所以我需要在整个实现过程中使用矩阵和它们的逆。虽然我开始测试矩阵及其逆的生成。
就我而言,我知道矩阵与其逆的乘法结果必须是一个标识矩阵,即它的主对角线是1并且在其他地方有零。所以我尝试按如下方式生成Vandermonde矩阵:
import numpy as np
from numpy.linalg import inv
x = np.array([1, 2, 3, 5])
x1 = np.vander(x)
x1
array([[ 1, 1, 1, 1],
[ 8, 4, 2, 1],
[ 27, 9, 3, 1],
[125, 25, 5, 1]])
并计算反函数如下:
x1_inv = inv(x1_inv)
inv(x1_inv)
array([[-0.125 , 0.33333333, -0.25 , 0.04166667],
[ 1.25 , -3. , 2. , -0.25 ],
[-3.875 , 7.66666667, -4.25 , 0.45833333],
[ 3.75 , -5. , 2.5 , -0.25 ]])
到目前为止一直很好,但通过在理论上乘以x1和x1_inv,我会期待如下的单位矩阵:
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
但这就是我得到的:
x1_inv.dot(x1)
array([[ 1.00000000e+00, 0.00000000e+00, -1.66533454e-16,
-1.38777878e-17],
[ 3.55271368e-15, 1.00000000e+00, 4.44089210e-16,
2.77555756e-17],
[ -1.42108547e-14, -1.77635684e-15, 1.00000000e+00,
-8.32667268e-16],
[ -7.10542736e-15, -8.88178420e-16, 2.22044605e-16,
1.00000000e+00]])
我在主对角线上得到一些,很好,但在其他地方没有零。我在这里错过了什么?令我惊讶的是,当我将假设的单位矩阵与主矩阵相乘时,我得到主矩阵,而我不应该因为所产生的单位矩阵实际上不是一个。
当我尝试np.allclose(x1.dot(inv(x1), np.eye(4))
时,我的回复是真的。
我的问题是:我在这里失踪了什么?为什么x1.dot(x1_inv)的结果看起来不像我期望的那样(一个单元矩阵与主对角线上的那些和其他地方的零)?