首页 > 解决方案 > 在使用 numpy.linalg.inv() 时没有得到具有矩阵的点积及其逆的单位矩阵

问题描述

from numpy.linalg import inv, qr
X = np.random.randn(5, 5)
mat = X.T.dot(X)
inv(mat)
mat.dot(inv(mat))

矩阵的点积及其逆应该是单位矩阵。但是,这里的输出是 -

array([[ 1.00000000e+00,  6.70961522e-16,  3.98202719e-16,
        -2.04084178e-15,  3.07963387e-16],
       [-6.46120445e-15,  1.00000000e+00,  4.44698794e-16,
         1.40254635e-15,  2.71601492e-16],
       [ 3.00736839e-15, -5.65091222e-16,  1.00000000e+00,
         1.63129995e-16, -6.43576692e-17],
       [ 1.01120865e-14, -1.23622826e-15, -6.99882344e-16,
         1.00000000e+00, -1.13627444e-16],
       [-6.31447442e-15,  2.46897480e-15,  9.95010178e-16,
        -2.81959392e-15,  1.00000000e+00]])

请解释。

标签: pythonmatrix

解决方案


这一定是由于算法舍入,但我发现如果你对矩阵进行对角化并用逆计算点积,你最终会得到单位矩阵。这可能是由于用于计算对角矩阵的逆矩阵的不同算法造成的。

import numpy as np
m = np.random.randn(5,5)
print(np.linalg.det(m))
e = np.linalg.eig(m)[0]
mdiag = np.eye(5)*e
print(mdiag.dot(np.linalg.inv(mdiag)))

这种方法似乎总是适用于 3x3 矩阵,但有时对于更大的矩阵会失败,因为在 1e-17 的顺序中留下了一个虚数部分


推荐阅读