by Julien Langou » Mon May 02, 2011 5:15 pm
If your matrix is tridiagonal nonsymmetric but such that T(i,i+1)*T(i+1,i) > 0 (for all i= 1 ... n-1), then you can use figi2.f from EISPACK, this subroutine outputs an orthogonal similarity transformation that transforms your nonsymmetric tridiagonal matrix into a symmetric tridiagonal one. Then you can solve the symmetric tridiagonal problem with any LAPACK tridiagonal eigensolvers. (They start as SSTExx: ssteqr, sstedc, or sstemr.)
Getting the eigenvalues is "easy". Getting the eigenvectors is somewhat harder. To obtain the eigenvectors, you need to "simply" multiply the two "z" matrices. figi2 gives you z_figi2. dsteqr gives you z_dsteqr. Now perform: z <- z_figi2 * z_dsteqr. You can do this by using the sgemm operation from BLAS. I never used the subroutine but we have a user for which all this works a few weeks ago.
If the matrix does not have the properties required by figi2.f, there is nothing I am aware off. Best you can do is consider your matrix as nonsymmetric Hessenberg ... Still a killer.
Julien.