Numpy CBLAS/LAPACK与Python中的矩阵求逆

Numpy CBLAS/LAPACK与Python中的矩阵求逆,numpy,matrix,lapack,matrix-inverse,cblas,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,

我试图反转的矩阵是:

    [ 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顺序上的小数字。现在也许DGETRIU不是最好的使用方法。然而,当我通过zgeqrf_uu和zungqr_u使用QR分解进行反演时,我得到了类似的答案。当我使用dgesvd作为使用SVD的逆函数时,我也得到了类似的答案

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

  • 那套程序做什么
  • 我可以使用什么样的CBLAS/LAPACK例程来反转该矩阵并获得类似CBLAS/LAPACK的结果(以便e1和e2被正确的零替换)
根据描述,似乎是的精简版:

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


查看,它会调用
getrf
,然后
getri

您需要使用
?GESV
?GESVX
进行全精度反演,而不是使用基于分解的解算器。LU速度更快,但正如您所看到的,它会失去精度。Scipy
linalg.solve
最近已切换到
\uuuuuuux
例程进行条件数检查。此外,除非需要参考,否则永远不要使用矩阵求逆。对于矩阵代数,总是使用solve.@percusse我不确定你所说的__x算法是什么意思。你能详细说明一下吗?我是说GESVX,POSVX,HESVX等等