[R] highest eigenvalues of a matrix

Katharine Mullen kate at few.vu.nl
Thu Jun 19 20:08:04 CEST 2008


On Thu, 19 Jun 2008, Martin Maechler wrote:

> >>>>> "KateM" == Katharine Mullen <kate at few.vu.nl>
> >>>>>     on Thu, 19 Jun 2008 11:50:22 +0200 (CEST) writes:
>
>     KateM> On Thu, 19 Jun 2008, Simon Wood wrote:
>     >> >
>     >> > I happily use eigen() to compute the eigenvalues and
>     >> eigenvectors of > a fairly large matrix (200x200, say),
>     >> but it seems over-killed as its > rank is limited to
>     >> typically 2 or 3. I sort of remember being taught > that
>     >> numerical techniques can find iteratively decreasing
>     >> eigenvalues > and corresponding orthogonal eigenvectors,
>     >> which would provide a nice > alternative (once I have the
>     >> first 3, say, I stop the search).
>     >>
>     >> Lanczos iteration will do this efficiently (see
>     >> e.g. Golub & van Loan "Matrix Computations"), but I don't
>     >> think that there are any such routines built into R or
>     >> LAPACK (although I haven't checked the latest LAPACK
>     >> release). When I looked it seemed that the LAPACK options
>     >> that allow you to select eigen-values/vectors still
>     >> depend on an initial O(n^3) decomposition of the matrix,
>     >> rather than the O(n^2) that a Lanczos based method would
>     >> require.
>     >>
>
>      KateM> ARPACK (http://www.caam.rice.edu/software/ARPACK/) uses a
>      KateM> Lanczos method for symmetric matrics; otherwise it uses an
>      KateM> Arnoldi iteration.  Development of an R interface to ARPACK
>      KateM> would be a nice project (but unfortunately one I don't have
>      KateM> time for for a while).  Maybe one of the maintainers of a
>      KateM> package for sparse matrices would be interested.
>
> Yes, thank you, Kate, we have been.
> The nice thing in ARPACK is its concept of "reverse
> communication", such that  we should be able to use it both
> for sparse and for dense matrices.
> We would only have to provide a "function" for computing
> "A %*% x" and hence could use different ones, depending on the
> class of A.... all in theory at least.
>
> One problem I see with the  with that code is that its README file contains
>
>   *** NOTE ***  Unless the LAPACK library on your system is version 2.0,
>    we strongly recommend that you install the LAPACK routines provided with
>    ARPACK. Note that the current LAPACK release is version 3.0; if you are
>    not sure which version of LAPACK is installed, pleaase compile and link
>    to the subset of LAPACK included with ARPACK.
>
> i.e. you need to use old/outdated Lapack with ARPACK instead of
> the current Lapack .  Something that sheds a bad light to ARPACK
> in my view.
>

Dear Martin,

I agree this is not ideal.  I wonder why it has not been kept up to date
with LAPACK and how broken it is with version 3.1.1. (but can't experiment
now).

> In the mean time (I've suffered from a computer crash and other
> interruptions) I see Gabor has already mentioned the following
>
>   Then, we have seen that the 'igraph' package als uses a port of
>   (part of) ARPACK as part of the C++ 'igraphlib' library.
>
>
>
>     >> My `mgcv' package (see cran) uses Lanczos iteration for
>     >> setting up low rank bases for smoothing. The source code
>     >> is in mgcv/src/matrix.c:lanczos_spd, but I'm afraid that
>     >> there is no direct R interface, although it would not be
>     >> too hard to write a suitable wrapper. It requires the
>     >> matrix to be symmetric.
>     >>
>     >> > Looking at the R source code for eigen and some posts
>     >> on this list, > it seems that the function uses a LAPACK
>     >> routine, but obviously all > the options are not
>     >> available through the R wrapper. I'm not > experienced
>     >> enough to try and make my own interface with Fortran >
>     >> code, so here are two questions:
>     >> >
>     >> > - is this option (choosing a desired number of
>     >> eigenvectors) already > implemented in some function /
>     >> package that I missed?  --- In the symmetric case you can
>     >> use `svd' which lets you select (although you'd need to
>     >> fix up the signs of the singular values to get
>     >> eigen-values if the matrix is not +ve definite). But this
>     >> answer is pretty useless as it will be slower than using
>     >> `eigen' and getting the full decomposition.
>     >>
>     >> Of course if you know that your matrix is low rank
>     >> because it's a product of non-square matrices then
>     >> there's usually some way of getting at the
>     >> eigen-decomposition efficiently. E.g. if A=B'B where B is
>     >> 3 by 1000, then the cost can easily be kept down to
>     >> O(1000^2) in R...
>     >>
>     >> best, Simon
>     >>
>     >> > - is the "range of indices" option in DSYEVR.f <
>     >> http:// > www.netlib.org/lapack/double/dsyevr.f > what I
>     >> think, the indices of > the desired eigenvalues ordered
>     >> from the highest to lowest?
>     >> >
>
>     KateM> dsyevr.f will work with symmetric real matrices only.  When the range
>     KateM> argument of dysevr is set to 'I', arguments il and iu
>     KateM> seem to specify the range of eigenvalue indices you
>     KateM> want in ascending order (lowest to highest, not
>     KateM> highest to lowest).  If you look at
>     KateM> https://svn.r-project.org/R/trunk/src/modules/lapack/Lapack.c
>     KateM> you see that range is always set to 'A'.
>
> yes, but do you agree that using 'I' (and a range) does not
> really help much, since the factorization used is the "full" one
> anyway ?
>

Now I see -- I had read

Eigenvalues and eigenvectors can be
*  selected by specifying either a range of values or a range of
*  indices for the desired eigenvalues.

with _selected_ magically replaced by _computed_.  Thanks.

>
>     >> > Many thanks in advance for any piece of advice,
>
>     >> > Sincerely,
>     >> >
>     >> > Baptiste
>     >> >
>     >> > dummy example if needed:
>     >> >
>     >> > test <- matrix(c(1, 2, 0, 4, 5, 6, 1.00001, 2, 0),
>     >> ncol=3) > eigen(test)
>     >> >
>     >> >
>     >> >
>     >> >
>     >> > _____________________________
>     >> >
>     >> > Baptiste Auguié
>     >> >
>     >> > Physics Department > University of Exeter > Stocker
>     >> Road, > Exeter, Devon, > EX4 4QL, UK
>     >> >
>     >> > Phone: +44 1392 264187
>     >> >
>     >> > http://newton.ex.ac.uk/research/emag >
>     >> http://projects.ex.ac.uk/atto
>     [............]
>
>
>     >> --
>     >> > Simon Wood, Mathematical Sciences, University of Bath,
>     >> Bath, BA2 7AY UK > +44 1225 386603
>     >> www.maths.bath.ac.uk/~sw283
>



More information about the R-help mailing list