我写了一个f90程序来测试lapack提供的子程序zheev.f。 我所做的是构建一个6x6对角矩阵(用于测试目的的真实条目)并计算特征值和特征向量。我得到的特征向量是正确的,但特征值是错误的,目前我无法理解为什么。我非常感谢任何帮助。
以下是代码:
program main
implicit none
external ZHEEV
complex*16, parameter :: Re=(1.0,0.0)
complex*16 :: egvc(6,6)
complex*16 :: egvl(6)
complex*16 :: Dmat(6,6)
!Lapack variables
character(len=1) :: JOBZ,UPLO
integer :: N,LDA,LWORK,INFO
real*16, allocatable :: W(:), RWORK(:)
complex*16, allocatable :: A(:,:), WORK(:)
!Dummies
integer :: i
!Inizialize lapack variables
JOBZ="V"
UPLO="U"
INFO=0
N=6
LDA=6
LWORK=N*2-1
allocate(A(N,N),W(N),WORK(LWORK),RWORK(N*3-2))
A=0.0*Re
W=0.0
WORK=0.0*Re
RWORK=0.0
!Initialize the matrix
Dmat=0.0*Re
do i=1,6
Dmat(i,i)=i*Re
enddo
!Query
A=Dmat
LWORK=-1
call zheev(JOBZ,UPLO,N,A,LDA,W,WORK,LWORK,RWORK,INFO)
if (INFO.eq.0) then
LWORK=int(real(WORK(1)))
deallocate(WORK)
allocate(WORK(LWORK))
WORK=0.0*Re
else if (INFO.ne.0) then
write(*,*) "From zheev: query for optimal workspace failed: STOP!"
deallocate(A,W,WORK,RWORK)
stop
endif
!Diagonalization
A=Dmat
call zheev(JOBZ,UPLO,N,A,LDA,W,WORK,LWORK,RWORK,INFO)
!Check
if (INFO.ne.0) then
write(*,*) "Diagonalization failed INFO=",INFO," STOP!"
deallocate(A,W,WORK,RWORK)
stop
endif
egvl=W
egvc=A
do i=1,6
write(55,*) egvl(i)
enddo
do i=1,6
write(66,*) real(egvc(i,:))
write(77,*) aimag(egvc(i,:))
enddo
deallocate(A,W,WORK,RWORK)
stop
end program main
在上述情况下,特征值应为{1,2,3,4,5,6}。我得到的是(大约){2,131072,33554432,0,0,0}。其他简单矩阵的类似奇怪结果,包括6x6单位矩阵。
以下是我编写代码的方法:
gfortran test_zheev.f90 -o test_zheev.x -llapack -lblas
以下是' lsb_release -a'的输出。命令:
没有可用的LSB模块。 分销商ID:Ubuntu 说明:Ubuntu 14.04.4 LTS 发布:14.04 代号:可信赖
以下是我安装库的方法:
sudo apt-get install libblas-dev liblapack-dev
(点击此链接:https://askubuntu.com/questions/623578/installing-blas-package)