Fortran lapck求数组的逆矩阵

    subroutine inv_cmplx(A,inv_A,N)
    use lapack95
    implicit none

    integer:: N ! 矩阵的大小
    integer:: info, lda, lwork, i
    integer:: ipiv(N)
    complex*16:: A(N,N), inv_A(N,N), work(N*N)

    inv_A = A
    ! 分配内存
    lda = N
    lwork = N*N

    ! 计算矩阵的LU分解
    call zgetrf(N, N, inv_A, lda, ipiv, info)

    if (info /= 0) then
        write(*,*) "LU分解失败!"
        stop
    end if

    ! 计算逆矩阵
    call zgetri(N, inv_A, lda, ipiv, work, lwork, info)
    end subroutine inv_cmplx

    subroutine inv_double(A,inv_A,N)
    use lapack95
    implicit none

    integer:: N ! 矩阵的大小
    integer:: info, lda, lwork, i
    integer:: ipiv(N)
    real*8:: A(N,N), inv_A(N,N), work(N*N)

    inv_A = A
    ! 分配内存
    lda = N
    lwork = N*N

    ! 计算矩阵的LU分解
    call dgetrf(N, N, inv_A, lda, ipiv, info)

    if (info /= 0) then
        write(*,*) "LU分解失败!"
        stop
    end if

    ! 计算逆矩阵
    call dgetri(N, inv_A, lda, ipiv, work, lwork, info)
    end subroutine inv_double

第一个函数是求复数的,第二个是求双精度的,注意求解的时候会覆写输入的数组。和MATLAB的INV函数是一致的。

你可能感兴趣的:(算法,线性代数)