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

Find only some eigenvectors with a banded matrix?

crispybits
Beginner
339 Views
Can this be done with the bisection followed by inverse iteration method?

I notice there don't seem to be any banded routines for finding only some e-vectors.

I tried the driver routine dsbevx, but it apparently must be using QR or divide-and-conquer because it requires an eigenvector matrix big enough to hold all eigenvectors, even if it's told to return only a few.It also takes the same amount of time to solve a 1000 DOF system for 4 e-vectors as it does to solve the same system for 200 e-vectors.

Is this very useful functionality absent from MKL? Will I have to use packed storage to solve large banded eigenproblems with minimum memory and realistic CPU time? I already have a dirty homemade algorithm that does better than this, surely I must be overlooking something??


0 Kudos
4 Replies
Gennady_F_Intel
Moderator
339 Views

Hello,
dsbevx is really using bisection followed by inverse iteration if a) you don't need all the eigenvectors, b) a positive tolerance is set, otherwise it goes to QR.
Actually, if you want eigenvectors, dsbevx needs n^2 memory regardless from the number of eigenvectors needed because it needs to reduce banded form to tri-diagonal and keep track of the orthogonal transformation done during the reduction.

0 Kudos
crispybits
Beginner
339 Views
Hi Gennady. Thanks but even those conditions aren't making it work properly. I tried abstol = 2 * dlamch('S') (which gives 4.4501477170144E-308 ). I've also treid abstol = 100 * dlamch('S'), and abstol = 0.0000001. In all cases it returns only the eigenvectors I ask for (1 to 4), but takes the same time if I ask for 200 eigenvectors.



Quoting - Gennady Fedorov (Intel)

Hello,
dsbevx is really using bisection followed by inverse iteration if a) you don't need all the eigenvectors, b) a positive tolerance is set, otherwise it goes to QR.
Actually, if you want eigenvectors, dsbevx needs n^2 memory regardless from the number of eigenvectors needed because it needs to reduce banded form to tri-diagonal and keep track of the orthogonal transformation done during the reduction.


0 Kudos
Michael_C_Intel4
Employee
339 Views

Hello.

It takes approximately the same time, because most time is spent by tri-diagonalization. The following process is quite quick no matter whether you need 4 or 200 vectors, but sure it will be different duration.

Michael.
0 Kudos
crispybits
Beginner
339 Views
Do you mean LAPACK has no algorithms that are efficient at finding a small number of eigenvectors in a large problem (say n> 2000) ?

These are the speeds it runs on my dual core Intel something-common:

For n=1563:
3 eigenvectors with dsbgvx: 44 seconds
1563 eigenvectors with dsbgvx: 61 seconds
3 eigenvectors with a homemade Visual Basic program without any fancy Intel optimizations: 59 seconds
>4 eigenvectors with the homemade VB program: Too long to wait

It doesn't show any dramatic slowdown with more e-vectors like I expected bisection was supposed to. This really makes it look like the wrong algorithm is being used?? I hope you're not right or LAPACK will be nearly useless to me.



Quoting - Michael Chuvelev (Intel)

Hello.

It takes approximately the same time, because most time is spent by tri-diagonalization. The following process is quite quick no matter whether you need 4 or 200 vectors, but sure it will be different duration.

Michael.

0 Kudos
Reply