[Rd] eigen(symmetric=TRUE) for complex matrices
Simone Giannerini
sgiannerini at gmail.com
Tue Jun 18 19:01:48 CEST 2013
1. OpenSuse 12.1 R compiled against ACML 5.3.1
> sessionInfo()
R version 3.0.1 RC (2013-05-08 r62723)
Platform: x86_64-unknown-linux-gnu (64-bit)
> A <- exp(-0.1*(row(jj)-col(jj))^2)
> min(eigen(A,T,T)$values)
[1] 2.521151e-10
> min(eigen(A+0i,T,T)$values)
[1] 2.521154e-10
2. OpenSuse 12.3 R compiled against Intel MKL 10.2
R version 3.0.0 Patched (2013-04-23 r62650)
Platform: x86_64-unknown-linux-gnu (64-bit)
> jj <- matrix(0,100,100)
> A <- exp(-0.1*(row(jj)-col(jj))^2)
> min(eigen(A,T,T)$values)
[1] 2.521153e-10
> min(eigen(A+0i,T,T)$values)
[1] 2.521154e-10
3. Windows 7 64, R 3.0.0p (binary, built-in libraries)
R version 3.0.0 Patched (2013-04-03 r62488)
Platform: x86_64-w64-mingw32/x64 (64-bit)
> jj <- matrix(0,100,100)
> A <- exp(-0.1*(row(jj)-col(jj))^2)
> min(eigen(A,T,T)$values)
[1] 2.521153e-10
> min(eigen(A+0i,T,T)$values)
[1] -0.359347
same behaviour with the 32 bit binaries.
On Tue, Jun 18, 2013 at 9:57 AM, peter dalgaard <pdalgd at gmail.com> wrote:
>
>
> On Jun 18, 2013, at 03:30 , robin hankin wrote:
>
> > R-3.0.1 rev 62743, binary downloaded from CRAN just now; macosx 10.8.3
> >
> > Hello,
> >
> > eigen(symmetric=TRUE) behaves strangely when given complex matrices.
> >
> >
> > The following two lines define 'A', a 100x100 (real) symmetric matrix
> > which theoretical considerations [Bochner's theorem] show to be positive
> > definite:
> >
> > jj <- matrix(0,100,100)
> > A <- exp(-0.1*(row(jj)-col(jj))^2)
> >
> >
> > A's being positive-definite is important to me:
> >
> >
> >> min(eigen(A,T,T)$values)
> > [1] 2.521153e-10
> >>
> >
> > Coercing A to a complex matrix should make no difference, but makes
> > eigen() return the wrong answer:
> >
> >> min(eigen(A+0i,T,T)$values)
> > [1] -0.359347
> >>
> >
> > This is very, very wrong.
>
> Yep. I see this also on 10.6/7 (Snow Leopard, Lion) and 3.0.x, but NOT with a MacPorts build of 2.15.3 that I had lying around.
>
> So this sits somewhere between Mac builds, R versions, and possibly LAPACK issues. Can anyone reproduce on non-Mac?
>
> It's not the first time complex matrices have acted up. We may need to put in a regression test to catch it earlier.
>
> >
> > I would expect these two commands to return identical values, up to
> > numerical precision. Compare svd():
> >
> >
> >> dput(min(eigen(A,T,T)$values))
> > 2.52115250343783e-10
> >> dput(min(eigen(A+0i,T,T)$values))
> > -0.359346984206908
> >> dput(min(svd(A)$d))
> > 2.52115166468044e-10
> >> dput(min(svd(A+0i)$d))
> > 2.52115166468044e-10
> >>
> >
> > So svd() doesn't care about the coercion to complex. The 'A' matrix
> > isn't particularly badly conditioned:
> >
> >
> >> eigen(A,T)$vectors -> e
> >> crossprod(e)[1:4,1:4]
> >
> > also:
> >
> >> crossprod(A,solve(A))
> >
> >
> > [and the associated commands with A+0i in place of A], give errors of
> > order 1e-14 or less.
> >
> >
> > I think the eigenvectors are misbehaving too:
> >
> >> eigen(A,T)$vectors -> ev1
> >> eigen(A+0i,T)$vectors -> ev2
> >> range(Re((A %*% ev1[,100])/ev1[,100]))
> > [1] 2.497662e-10 2.566555e-10 # min=max mathematically;
> > differences due to numerics
> >> range(Re((A %*% ev2[,100])/ev2[,100]))
> > [1] -19.407290 4.412938 # off the scale errors
> > [note the difference in sign]
> >>
> >
> >
> > FWIW, these problems do not appear to occur if symmetric=FALSE:
> >
> >> min(Re(eigen(A+0i,F,T)$values))
> > [1] 2.521153e-10
> >> min(Re(eigen(A,F,T)$values))
> > [1] 2.521153e-10
> >>
> >
> > and the eigenvectors appear to behave themselves too.
> >
> >
> > Also, can I raise a doco? The documentation for eigen() is not
> > entirely transparent with regard to the 'symmetric' argument. For
> > complex matrices, 'symmetric' should read 'Hermitian':
> >
> >
> >> B <- matrix(c(2,1i,-1i,2),2,2) # 'B' is Hermitian
> >> eigen(B,F,T)$values
> > [1] 3+0i 1+0i
> >> eigen(B,T,T)$values # answers agree as expected if 'symmetric' means
> > 'Hermitian'
> > [1] 3 1
> >
> >
> >
> >> C <- matrix(c(2,1i,1i,2),2,2) # 'C' is symmetric
> >> eigen(C,F,T)$values
> > [1] 2-1i 2+1i
> >> eigen(C,T,T)$values # answers disagree because 'C' is not Hermitian
> > [1] 3 1
> >>
> >
>
> This issue, however, I do not understand; ?eigen already has:
>
>
> symmetric: if ‘TRUE’, the matrix is assumed to be symmetric (or
> Hermitian if complex) and only its lower triangle (diagonal
> included) is used. If ‘symmetric’ is not specified, the
> matrix is inspected for symmetry.
>
> Which part of "Hermitian if complex" is unclear?
>
> --
> Peter Dalgaard, Professor,
> Center for Statistics, Copenhagen Business School
> Solbjerg Plads 3, 2000 Frederiksberg, Denmark
> Phone: (+45)38153501
> Email: pd.mes at cbs.dk Priv: PDalgd at gmail.com
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
--
___________________________________________________
Simone Giannerini
Dipartimento di Scienze Statistiche "Paolo Fortunati"
Universita' di Bologna
Via delle belle arti 41 - 40126 Bologna, ITALY
Tel: +39 051 2098262 Fax: +39 051 232153
http://www2.stat.unibo.it/giannerini/
More information about the R-devel
mailing list