Computing the inverse of a matrix using lapack in C

前端 未结 4 1643
旧巷少年郎
旧巷少年郎 2020-12-07 19:24

I would like to be able to compute the inverse of a general NxN matrix in C/C++ using lapack.

My understanding is that the way to do an inversion in la

4条回答
  •  眼角桃花
    2020-12-07 19:40

    First, M has to be a two-dimensional array, like double M[3][3]. Your array is, mathematically speaking, a 1x9 vector, which is not invertible.

    • N is a pointer to an int for the order of the matrix - in this case, N=3.

    • A is a pointer to the LU factorization of the matrix, which you can get by running the LAPACK routine dgetrf.

    • LDA is an integer for the "leading element" of the matrix, which lets you pick out a subset of a bigger matrix if you want to just invert a little piece. If you want to invert the whole matrix, LDA should just be equal to N.

    • IPIV is the pivot indices of the matrix, in other words, it's a list of instructions of what rows to swap in order to invert the matrix. IPIV should be generated by the LAPACK routine dgetrf.

    • LWORK and WORK are the "workspaces" used by LAPACK. If you are inverting the whole matrix, LWORK should be an int equal to N^2, and WORK should be a double array with LWORK elements.

    • INFO is just a status variable to tell you whether the operation completed successfully. Since not all matrices are invertible, I would recommend that you send this to some sort of error-checking system. INFO=0 for successful operation, INFO=-i if the i'th argument had an incorrect input value, and INFO > 0 if the matrix is not invertible.

    So, for your code, I would do something like this:

    int main(){
    
        double M[3][3] = { {1 , 2 , 3},
                           {4 , 5 , 6},
                           {7 , 8 , 9}}
        double pivotArray[3]; //since our matrix has three rows
        int errorHandler;
        double lapackWorkspace[9];
    
        // dgetrf(M,N,A,LDA,IPIV,INFO) means invert LDA columns of an M by N matrix 
        // called A, sending the pivot indices to IPIV, and spitting error 
        // information to INFO.
        // also don't forget (like I did) that when you pass a two-dimensional array
        // to a function you need to specify the number of "rows"
        dgetrf_(3,3,M[3][],3,pivotArray[3],&errorHandler);
        //some sort of error check
    
        dgetri_(3,M[3][],3,pivotArray[3],9,lapackWorkspace,&errorHandler);
        //another error check
    
        }
    

提交回复
热议问题