Intel® oneAPI Math Kernel Library
Ask questions and share information with other developers who use Intel® Math Kernel Library.

Eigenvectors using MKL


Hi, I need help to calculate Eigenvectors using MKL routines.

I have some codes that were compiled using Compaq Visual Fortran and they had IMSL libraries within. Now I'm using Visual Studio 2010+Visual Fortran XE 2013. And I'm trying to convert those old codes without IMSL, but using MKL (Lapack) functions. In this case is the function DEVCRG ( ). As you can check they have an example in that page. That's the same matrix i'm trying in the code bellow. I've checked with MATLAB and I've found the same results.

So, here we go with MKL, following the decision tree ( ) in the manual I'm trying in this sequence those routines: ?gebal , ?gehrd , ?unghr , ?hseqr , ?trevc , ?gebak

I've arrived to find the eigenvalues, but I can't find the eigenvectors!!

0.2000E+01 0.4000E+01
0.2000E+01 -.4000E+01
0.1000E+01 -.2297E-15


    program eigenvalvec

    use MKL95_LAPACK
    implicit none
    double precision, allocatable :: x(:,:),scalev(:)
    double complex, allocatable :: xc(:,:),tauc(:),w(:),uph(:,:),q(:,:),vr(:,:),vl(:,:),qz(:,:)
    logical, allocatable :: select(:)
    integer :: n = 3.0
    integer :: nouput,i,ilo,ihi,info
    character*14 file10
    x(1,1)=8.0 ; x(1,2)=-1.0 ; x(1,3)=-5.0
    x(2,1)=-4.0 ; x(2,2)=4.0 ; x(2,3)=-2.0
    x(3,1)=18.0 ; x(3,2)=-5.0 ; x(3,3)=-7.0
    xc = CMPLX(x)
    call gebal(xc,scalev,ilo,ihi,'P',info) !Balances a general matrix to improve the accuracy of computed eigenvalues and eigenvectors
    uph = xc
    call gehrd(uph,tauc,ilo,ihi,info) !Reduces a general matrix to upper Hessenberg form

    q = uph
    call unghr(q,tauc,ilo,ihi,info) !Generates the complex unitary matrix Q determined by ?gehrd.
    call hseqr(uph,w,ilo,ihi,q,'S','I',info) !Computes all eigenvalues and (optionally) the Schur factorization of a matrix reduced to Hessenberg form.
    !w: EIGENVALUES!!!
    vl = q
    vr = q
    call trevc(uph,'B',select,vl,vr,n,info) !Computes selected eigenvectors of an upper (quasi-)triangular matrix computed by ?hseqr.
    call gebak(vr,scalev,ilo,ihi,'B','R',info) !Transforms eigenvectors of a balanced matrix to those of the original nonsymmetric matrix.

    end program eigenvalvec

Please, I really need some light on that... specially with "?trevc". Thank you very much!!!

0 Kudos
1 Reply

Someone told me to skip all that trouble and use the call GEEVX.

I feel I'm almost there to find the eigenvectors exactly like DEVCRG (from IMSL) and MATLAB. In that case:

  0.3162 + 0.3162i   0.3162 - 0.3162i   0.4082          

 -0.0000 + 0.6325i  -0.0000 - 0.6325i   0.8165          

  0.6325             0.6325             0.4082  

Well, using geevx and setting "balanc" as 'N' or 'P' I find:

 0.3162  0.3162     0.3162  0.3162     0.4082 -0.0000

-0.0000  0.6325     0.6325  0.0000     0.8165  0.0000

 0.6325  0.0000    -0.0000  0.6325     0.4082 -0.0000

Now setting "balanc" as 'S' or 'B' I get:

 0.3162 -0.3162     0.3162 -0.3162     0.4082  0.0000

 0.6325  0.0000    -0.0000 -0.6325     0.8165  0.0000

-0.0000 -0.6325     0.6325  0.0000     0.4082  0.0000

I couldn't set the variable "abnrm". I can't set the right type of it. But anyway, I don't think it will affect the result, since it is only an output. Here is the new code I have:

program eigsreal


implicit none
double precision, allocatable :: x(:,:),scalev(:),rconde(:),rcondv(:)
double complex, allocatable :: xc(:,:),w(:),vr(:,:),vl(:,:)
integer :: n = 3.0
integer :: nouput,iochek,i,ilo,ihi,info
character*14 file10


x(1,1)=8.0 ; x(1,2)=-1.0 ; x(1,3)=-5.0
x(2,1)=-4.0 ; x(2,2)=4.0 ; x(2,3)=-2.0
x(3,1)=18.0 ; x(3,2)=-5.0 ; x(3,3)=-7.0

xc = CMPLX(x)

!pg 1202
!?geevx - Computes the eigenvalues and left and right eigenvectors of a general matrix, with preliminary
!         matrix balancing, and computes reciprocal condition numbers for the eigenvalues and right eigenvectors.

!call geevx(a, w[,vl] [,vr] [,balanc] [,ilo] [,ihi] [,scale] [,abnrm] [,rconde] [,rcondv] [,info])

call geevx(xc,w,vl,vr,'P',ilo,ihi,scalev)

do i = 1,n
    write(nouput,'(36(F10.4,1x))') vr(i,:)
end do

end program eigsreal


0 Kudos