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函数是一致的。