在python中求逆矩阵时遇到问题

在python中求逆矩阵时遇到问题,python,numpy,matrix,Python,Numpy,Matrix,我有一个python中的矩阵,我正在尝试反转它。但是,将倒置矩阵乘以原始矩阵的结果不会产生单位矩阵 M = np.matrix(cv) invM = np.linalg.inv(M) M@invM 我不确定会出现什么问题,因为这是一个相当简单的操作。还有其他人有这个问题吗?或者有人知道如何解决这个问题吗?谢谢 m = np.matrix([[2,3],[4,5]]) n = m.I i = m@n print(i) out: [[1. 0.] [0. 1.]] 这样试试 试着这样做。很

我有一个python中的矩阵,我正在尝试反转它。但是,将倒置矩阵乘以原始矩阵的结果不会产生单位矩阵

M = np.matrix(cv)
invM = np.linalg.inv(M)
M@invM

我不确定会出现什么问题,因为这是一个相当简单的操作。还有其他人有这个问题吗?或者有人知道如何解决这个问题吗?谢谢

m = np.matrix([[2,3],[4,5]])
n = m.I
i = m@n
print(i)

out:
[[1. 0.]
 [0. 1.]]
这样试试

试着这样做。

很可能,你的矩阵是,这意味着矩阵接近不可逆。您可以使用以下方法检查矩阵的条件编号:

np.linalg.cond(M)
双精度浮子的相对精度约为1e-16。对于条件数K,精度损失约一个因子K。如果K大于1e+15,则该矩阵在实际应用中是不可逆的

如果要为
x
求解
A@x=b
,通常使用
x=np.linalg.solve(A,b)
x=np.linalg.inv(A)@b更准确

以下是几个具有不同条件数的矩阵及其逆矩阵的性质:

import numpy as np
np.random.seed(1)
n = 100

def test_inv(a):
    print(f'Condition number: {np.linalg.cond(a):.3g}')
    max_err = np.abs(a @ np.linalg.inv(a) - np.eye(n)).max()
    print(f'a @ a_inv - eye: maximum error = {max_err:.3g}')    

# identity matrix
test_inv(np.eye(n))

# random numbers
randmat = np.random.uniform(-1, 1, size=(n, n))
test_inv(randmat)

# random numbers, but one row is almost a linear combination of
# two other rows.
badmat = randmat.copy()
badmat[1, :] = badmat[0, :] + badmat[2, :] - 1e-9
test_inv(badmat)
输出:

Condition number: 1
a @ a_inv - eye: maximum error = 0
Condition number: 626
a @ a_inv - eye: maximum error = 2.84e-14
Condition number: 1.64e+10
a @ a_inv - eye: maximum error = 1.53e-06
很可能,你的矩阵是,这意味着矩阵接近不可逆。您可以使用以下方法检查矩阵的条件编号:

np.linalg.cond(M)
双精度浮子的相对精度约为1e-16。对于条件数K,精度损失约一个因子K。如果K大于1e+15,则该矩阵在实际应用中是不可逆的

如果要为
x
求解
A@x=b
,通常使用
x=np.linalg.solve(A,b)
x=np.linalg.inv(A)@b更准确

以下是几个具有不同条件数的矩阵及其逆矩阵的性质:

import numpy as np
np.random.seed(1)
n = 100

def test_inv(a):
    print(f'Condition number: {np.linalg.cond(a):.3g}')
    max_err = np.abs(a @ np.linalg.inv(a) - np.eye(n)).max()
    print(f'a @ a_inv - eye: maximum error = {max_err:.3g}')    

# identity matrix
test_inv(np.eye(n))

# random numbers
randmat = np.random.uniform(-1, 1, size=(n, n))
test_inv(randmat)

# random numbers, but one row is almost a linear combination of
# two other rows.
badmat = randmat.copy()
badmat[1, :] = badmat[0, :] + badmat[2, :] - 1e-9
test_inv(badmat)
输出:

Condition number: 1
a @ a_inv - eye: maximum error = 0
Condition number: 626
a @ a_inv - eye: maximum error = 2.84e-14
Condition number: 1.64e+10
a @ a_inv - eye: maximum error = 1.53e-06

那张照片到底显示了什么?非对角值有多大?对于浮点计算,精确的0值很少出现。查看该
@
的数值,而不仅仅是一个图像。
np.max(np.abs)是什么((Mi@M)-np.eye(M.shape[0]))
那张图像到底显示了什么?非对角值有多大?对于浮点计算,精确的0值很少出现。查看该
@
的数值,而不仅仅是一个图像。
np.max(np.abs)是什么((Mi@M)-np.eye(M.shape[0])
用一个没有那么干净的解决方案的浮点数组演示这一点。用一个没有那么干净的解决方案的浮点数组演示这一点。