代码之家  ›  专栏  ›  技术社区  ›  Wahyu Hadinoto

在python上求奇异矩阵的逆

  •  -2
  • Wahyu Hadinoto  · 技术社区  · 6 年前

    我必须从中读取多个数据 csv 当我想从 csv文件 数据,我明白了:

    numpy.linalg.linalg.LinAlgError: singular matrix
    

    而这个过程就停留在这一部分:

    J = np.mat([dtdx,dtdy,dtdz]).transpose()
    dd = np.mat(ttcal-tt)
    dm = (scipy.linalg.inv(J.transpose()*J))*((J.transpose())*(dd.transpose()))
    

    [[-6.81477651e-03 -7.90320450e-03  6.50533437e-05]
     [-6.71080644e-03 -6.00135428e-03  6.50533437e-05]]
    

    “dd”的数据如下:

    [[0.00621772 0.00537531]]
    

    tes = J.transpose()*J
    

    [[ 9.14761019e-05  9.41324993e-05 -8.79884397e-07]
     [ 9.41324993e-05  9.84768945e-05 -9.04538042e-07]
     [-8.79884397e-07 -9.04538042e-07  8.46387506e-09]]
    

    我需要反转这个矩阵,但这个数据是奇异矩阵。我必须尝试在matlab r2017b和运行良好。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Eypros    6 年前

    你用过吗 pseudo-inverse numpy.linalg.pinv 相反呢?它应该处理这些情况。

    B = np.linalg.pinv(a)
    

    但我建议你检查一下你的矩阵计算是否正确,是否应该出现一个奇异矩阵。

        2
  •  1
  •   Sreeram TP    6 年前

    如果你确定你所做的计算是正确的,这是你想要的,那么你可以为你的奇异矩阵的psuedo逆。

    可以用python这样做。。

    mat = np.array([[ 9.14761019e-05,  9.41324993e-05, -8.79884397e-07],
     [ 9.41324993e-05,  9.84768945e-05, -9.04538042e-07],
     [-8.79884397e-07, -9.04538042e-07,  8.46387506e-09]])
    
    p_inv = np.linalg.pinv(mat)
    
    print(p_inv)
    
    # output
    
    array([[-1.00783988e+13,  5.50963966e+11, -9.88844703e+14],
           [ 5.50963966e+11, -3.01194390e+10,  5.40580308e+13],
           [-9.88844703e+14,  5.40580308e+13, -9.70207468e+16]])