1
Lapack에서 ZGEEV 루틴을 사용하여 테스트 문제를 해결하고 몇 가지 어려움을 겪고 있습니다. 1 주일 전에 FORTRAN에서 코딩을 시작 했으므로 빠뜨린 것이 너무 사소한 것 같습니다.FORTRAN ZGEEV, 모두 0 고유 값
대용량의 복잡한 대칭 행렬을 대각 화해야합니다. 시작하려면 Matlab을 사용하여 대각선 화 가능하다는 것을 확인한 200 x 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 사이즈 (30), 작은 행렬에 동일한 코드를 시도하고 잘 작동합니다. 어떤 도움을 주시면 감사하겠습니다! 감사.
내가 제대로 작동하는지 확인한 테스트 파일에서 행렬을로드 중입니다.
고맙습니다. 그것은 효과가 있었다. – Jeremie187