Page 1 of 1

Finding k largest eigenvalues

PostPosted: Mon Sep 17, 2012 8:03 am
by mjadidi
Is there any method or future to implement algorithms like lanczos algorithms to find the k largest eigen values? Is there any solution for now?

Re: Finding k largest eigenvalues

PostPosted: Mon Sep 17, 2012 9:09 am
by john
These exist for symmetric and hermitian matrices in the syevx/heevx routines.

Re: Finding k largest eigenvalues

PostPosted: Tue Sep 18, 2012 3:50 am
by mjadidi
yes, I just realized that I can find eigenvalues in a specific range or specific indices.But what would be the corresponding eigenvectors if I set rang to "I"

Re: Finding k largest eigenvalues

PostPosted: Tue Sep 18, 2012 5:55 am
by john
Assuming you set JOBZ to 'V' then you'll get the appropriate number of vectors in Z.

Re: Finding k largest eigenvalues

PostPosted: Wed Sep 19, 2012 2:46 am
by mjadidi
Yes, it works now.Thanks.

but can you tell me y when I set m= iu-il+1 I get kind of wired answer? Because when I set m=n it makes more sense :

for example for a matrix of 8x8 dimension I get following result for top 4 eigenvectors:
eigenvalues:
[ 8.00000000e-04 8.00000000e-04 8.00000000e-04 8.00000000e-04
2.45898573e+00 3.11167768e+00 9.95596484e+00 2.56381985e+01]

eigenvectors:
scipy.linalg.eigh :
[[-0.14611719 0.78394033 -0.31431961 -0.25958747]
[-0.00860211 -0.23798928 0.39718488 -0.46557788]
[ 0.18952489 0.0831798 -0.09898343 -0.16464493]
[ 0.28435409 -0.21043358 -0.61696779 -0.44713126]
[-0.04668508 -0.27840988 -0.45123004 -0.04021424]
[ 0.5469773 -0.07060557 0.24148952 -0.39681434]
[ 0.17376323 0.41502762 0.29308223 -0.25266402]
[ 0.72817684 0.15116997 -0.07195456 0.5156543 ]]

with m=n:

[[-0.14611719 0.78394033 -0.31431961 -0.25958747 0. 0. 0.
0. ]
[-0.00860211 -0.23798928 0.39718488 -0.46557788 0. 0. 0.
0. ]
[ 0.18952489 0.0831798 -0.09898343 -0.16464493 0. 0. 0.
0. ]
[ 0.28435409 -0.21043358 -0.61696779 -0.44713126 0. 0. 0.
0. ]
[-0.04668508 -0.27840988 -0.45123004 -0.04021424 0. 0. 0.
0. ]
[ 0.5469773 -0.07060557 0.24148952 -0.39681434 0. 0. 0.
0. ]
[ 0.17376323 0.41502762 0.29308223 -0.25266402 0. 0. 0.
0. ]
[ 0.72817684 0.15116997 -0.07195456 0.5156543 0. 0. 0.
0. ]]

with m= iu-il+1

[[-0.14611719 -0.04668508 0.78394033 -0.27840988 -0.31431961 -0.45123004
-0.25958747 -0.04021424]
[-0.00860211 0.5469773 -0.23798928 -0.07060557 0.39718488 0.24148952
-0.46557788 -0.39681434]
[ 0.18952489 0.17376323 0.0831798 0.41502762 -0.09898343 0.29308223
-0.16464493 -0.25266402]
[ 0.28435409 0.72817684 -0.21043358 0.15116997 -0.61696779 -0.07195456
-0.44713126 0.5156543 ]]

Re: Finding k largest eigenvalues

PostPosted: Wed Sep 19, 2012 6:13 am
by john
I'm sorry, I don't understand the question - M is an output from this routine.

Re: Finding k largest eigenvalues

PostPosted: Wed Sep 19, 2012 6:25 am
by mjadidi
john wrote:I'm sorry, I don't understand the question - M is an output from this routine.


sorry for bad explanation.
Yes, but the question is what would be the value of M . Base on the documents when I set RANGE to "I" the value of M should be iu-il+1 . in this case the eigenvectors (Z) has some confusing format. but when I set to m=n the resulted eigenvectors have different indexes.


for comparison look at the first two rows of eigenvectors:

in case m=n :
[[-0.14611719 0.78394033 -0.31431961 -0.25958747 0. 0. 0.
0. ]
[-0.00860211 -0.23798928 0.39718488 -0.46557788 0. 0. 0.
0. ]

but for m=iu-il+1

[[-0.14611719 -0.04668508 0.78394033 -0.27840988 -0.31431961 -0.45123004
-0.25958747 -0.04021424]
[-0.00860211 0.5469773 -0.23798928 -0.07060557 0.39718488 0.24148952
-0.46557788 -0.39681434]


you see the latter case I have some other values between my eigenvectors.

Sorry If don't explain well the problem.

Re: Finding k largest eigenvalues

PostPosted: Wed Sep 19, 2012 10:48 am
by kyle
Like John said, M is an output value that when using the integer range option should be equal to IU-IL+1.

Are you setting IL and IU? For example, if you want the top 2 values it should be IL=1 and UL=2 (not the Fortran 1-base indexing).

From the docs:
Code: Select all
If RANGE='I', the indices (in ascending order) of the smallest and largest eigenvalues to be returned.

1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0.

Re: Finding k largest eigenvalues

PostPosted: Thu Sep 20, 2012 4:21 am
by mjadidi
Yes I know this about M but when I set to to IU-IL+1. the answer is not obvious for me. Did you check my result on previews post about different values of M?

kyle wrote:
Are you setting IL and IU? For example, if you want the top 2 values it should be IL=1 and UL=2 (not the Fortran 1-base indexing).


But by setting IL=1 and UL=2 I am getting the 2 smallest eigenvalues not largest. for a 8x8 matrix for getting top 2 I should set IL=6 and UL=8.

Re: Finding k largest eigenvalues

PostPosted: Thu Sep 20, 2012 8:00 am
by kyle
You are correct about the ordering, this routine does indeed order the eigenvalues from lowest to smallest.

I just ran a similar problem.

Range = I; N = 8; IL = 6; IU = 8

Values:
Code: Select all
[0]   0.60990590602159556   
[1]   0.70335476519539919   


Vectors:
Code: Select all
[0]   0.30120404264911910   double
[1]   0.34704179211947256   double
[2]   0.22719182935148297   double
[3]   0.42993973500585869   double
[4]   0.33341002307228246   double
[5]   0.43737133822625307   double
[6]   0.33032203696194246   double
[7]   0.37524023913192073   double

[8]   0.076775878678010015   double
[9]   -0.41740538801404498   double
[10]   -0.25349112551809067   double
[11]   0.56032238991829530   double
[12]   -0.60328068615833719   double
[13]   0.037490411343624956   double
[14]   0.25657054787550626   double
[15]   0.10236069498767375   double


And with

Range = A; N = 8

Values:
Code: Select all
...
[6]   0.60990590602159567
[7]   0.70335476519539941


Vectors:
Code: Select all
...
[48]   0.30120404264911949   double
[49]   0.34704179211947273   double
[50]   0.22719182935148283   double
[51]   0.42993973500585947   double
[52]   0.33341002307228307   double
[53]   0.43737133822625301   double
[54]   0.33032203696194229   double
[55]   0.37524023913192039   double

[56]   0.076775878678010057   double
[57]   -0.41740538801404492   double
[58]   -0.25349112551809044   double
[59]   0.56032238991829464   double
[60]   -0.60328068615833819   double
[61]   0.037490411343625317   double
[62]   0.25657054787550626   double
[63]   0.10236069498767436   double


My results were as expected, the last 2 vectors and values from the 'all' version matched the results from the 'range' version.

Perhaps you have a data layout issue? CULA is column major which might differ from your reference implementation.

Re: Finding k largest eigenvalues

PostPosted: Tue Sep 25, 2012 3:02 am
by mjadidi
I have to investigate more about it then. Thanks