Fortran mkl库函数
1. cheevd复厄密矩阵对角化
厄密矩阵本征值与本征矢的求解
2.getrf,getri 矩阵求逆
getrf 对一个矩阵进行LU分解
getri 计算由LU分解后矩阵的逆
program main
use lapack95 !调用函数库,确保使用的函数存在
!如果时用的是intel fortran,则在编译的时候注释上一行,加入-mkl编译选项即可。
implicit none
integer, parameter :: n = 3
integer :: i, j, temp(n)
real(kind=8) :: a(n,n), aa(n,n)
call random_seed()
call random_number(a)
aa = a
write(*,'(1x,a)') "a = "
do i = 1, n
write(*,'(*(f12.6,3x))') a(i,:)
end do
!使用库函数求逆
call getrf( a, temp )!先进性LU分解
call getri( a, temp )!然后进行矩阵求逆
write(*,'(1x,a)') 'inv(a) = '
do i = 1, n
write(*,'(*(f12.6,3x))') a(i,:)
end do
write(*,'(1x,a)') "checking..."
aa = matmul(aa,a) !// 原矩阵与其逆矩阵的结果为单位矩阵
do i = 1, n
write(*,'(*(f12.6,3x))') aa(i,:)
end do
end program main
结果如下
a =
0.959299 0.268247 0.274620
0.013673 0.082084 0.275984
0.056097 0.730892 0.177709
inv(a) =
1.072178 -0.876915 -0.295021
-0.074784 -0.888503 1.495423
-0.030876 3.931107 -0.430155
checking...
1.000000 0.000000 -0.000000
-0.000000 1.000000 0.000000
-0.000000 0.000000 1.000000
3.?geev一般矩阵对角化
call sgeev(jobvl, jobvr, n, a, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info) call dgeev(jobvl, jobvr, n, a, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info) call cgeev(jobvl, jobvr, n, a, lda, w, vl, ldvl, vr, ldvr, work, lwork, rwork, info)