CBLAS / LAPACK与Python中的矩阵求逆

时间:2017-07-28 16:25:11

标签: numpy matrix lapack matrix-inverse cblas

我试图反转的矩阵是:

    [ 1  0  1]
A = [ 2  0  1]
    [-1  1  1] 

真正的逆是:

       [-1  1  0]
A^-1 = [-3  2  1]
       [ 2 -1  0]

使用Python的numpy.linalg.inv,我得到了正确的答案。矩阵逆的一个例程使用dgetri_,它是:

void compute_matrix_inverse_dbl( double* matrix,
                                 int order,
                                 double * inverse )
{

    int N, lwork;
    int success;
    int *pivot;
    double* workspace;

    //===Allocate Space===//
    pivot = malloc(order * order * order * sizeof(*pivot));
    workspace = malloc(order * order * sizeof(*workspace));

    //===Run Setup===//
    N = order;
    copy_array_dbl(matrix, order*order, inverse);
    lwork = order*order;

    //===Factor Matrix===//
    dgetrf_(&N,&N,inverse,&N,pivot,&success);

    //===Compute Inverse===//
    dgetri_(&N, inverse, &N, pivot, workspace, &lwork, &success);

    //===Clean Up===//
    free(workspace);
    free(pivot);

    return;
  }

使用这个例程,我得到:

       [-1   1 +-e1 ]
A^-1 = [-3   2   1  ]
       [ 2  -1 +-e2 ]

其中e1和e2和小数字的机器精度为1e-16。现在也许dgetri_不是最好用的。但是,当我通过zgeqrf_和zungqr_使用QR分解进行反转时,我得到了类似的答案。当我使用dgesvd_反向使用SVD时,我也得到了类似的答案。

Python似乎使用了一个名为_umath_linalg.inv的例程。所以我有几个问题:

  • 那例程做什么?
  • 我可以使用什么CBLAS / LAPACK例程来反转这个矩阵并得到像CBLAS / LAPACK这样的结果(这样e1和e2会被正确的零替换)?

1 个答案:

答案 0 :(得分:0)

根据说明,numpy.linalg.inv似乎是scipy.linalg.inv的精简版本:

  

此模块是SciPy中linalg.py模块的精简版本,   包含LAPACK库的高级Python接口。

看着scipy.linalg.inv,它先呼叫getrf,然后呼叫getri