我试图在Lapack中使用ZGEEV例程来解决测试问题并遇到一些困难。我刚刚在一周前开始在FORTRAN编码,所以我认为这可能是我失踪的非常微不足道的事情。
我必须对角化相当大的复杂对称矩阵。为了开始,使用Matlab我创建了一个200乘200的矩阵,我已验证它是可对角化的。当我运行代码时,它没有出现任何错误,INFO = 0,表明成功。但是,所有特征值都是(0,0),我知道这是错误的。
附上我的代码。
PROGRAM speed_zgeev
IMPLICIT NONE
INTEGER(8) :: N
COMPLEX*16, DIMENSION(:,:), ALLOCATABLE :: MAT
INTEGER(8) :: INFO, I, J
COMPLEX*16, DIMENSION(:), ALLOCATABLE :: RWORK
COMPLEX*16, DIMENSION(:), ALLOCATABLE :: D
COMPLEX*16, DIMENSION(1,1) :: VR, VL
INTEGER(8) :: LWORK = -1
COMPLEX*16, DIMENSION(:), ALLOCATABLE :: WORK
DOUBLE PRECISION :: RPART, IPART
EXTERNAL ZGEEV
N = 200
ALLOCATE(D(N))
ALLOCATE(RWORK(2*N))
ALLOCATE(WORK(N))
ALLOCATE(MAT(N,N))
OPEN(UNIT = 31, FILE = "newmat.txt")
OPEN(UNIT = 32, FILE = "newmati.txt")
DO J = 1,N
DO I = 1,N
READ(31,*) RPART
READ(32,*) IPART
MAT(I,J) = CMPLX(RPART, IPART)
END DO
END DO
CLOSE(31)
CLOSE(32)
CALL ZGEEV('N','N', N, MAT, N, D, VL, 1, VR, 1, WORK, LWORK, RWORK, INFO)
INFO = WORK(1)
DEALLOCATE(WORK)
ALLOCATE(WORK(INFO))
CALL ZGEEV('N','N', N, MAT, N, D, VL, 1, VR, 1, WORK, LWORK, RWORK, INFO)
IF (INFO .EQ. 0) THEN
PRINT*, D(1:10)
ELSE
PRINT*, INFO
END IF
DEALLOCATE(MAT)
DEALLOCATE(D)
DEALLOCATE(RWORK)
DEALLOCATE(WORK)
END PROGRAM speed_zgeev
我在较小的矩阵上尝试了相同的代码,大小为30 x 30,它们工作正常。任何帮助,将不胜感激!感谢。
我忘了提到我正在从我已经验证正常工作的测试文件中加载矩阵。
答案 0 :(得分:3)
可能LWORK = WORK (1)
代替INFO = WORK(1)
?同时更改ALLOCATE(WORK(INFO))
。