# [R] rank of a matrix

Gabor Grothendieck ggrothendieck at gmail.com
Thu May 5 01:18:28 CEST 2005

```One could also examine the eigenvalues themselves:

plot(log(abs(sort(-eigen(h9times4, T, T)\$values))))

shows a graph with a definite gap between 9 and 10 suggesting
that 9 is the right number.

On 5/4/05, Ravi Varadhan <rvaradha at jhsph.edu> wrote:
> For the example that Duncan just gave, using the "matrix.rank" function of
> Spencer Graves (which uses singular value decomposition) I obtained the
> following result:
>
> > exponent <- -(7:16)
> > eps <- 10^exponent
> > sapply(eps,mat=h9times4,function(x,mat)matrix.rank(mat,x))
> [1] 6 7 7 8 8 9 9 9 9 9
>
> This tells me that the correct rank should be 9, since the rank stabilizes
> for smaller tolerances.  I realize that this may not work generally, and one
> could create counter-examples to defeat this strategy.
>
> Best,
> Ravi.
>
> --------------------------------------------------------------------------
> Ravi Varadhan, Ph.D.
> Assistant Professor,  The Center on Aging and Health
> Division of Geriatric Medicine and Gerontology
> Johns Hopkins University
> Ph: (410) 502-2619
> Fax: (410) 614-9625
> Email:  rvaradhan at jhmi.edu
> --------------------------------------------------------------------------
> > -----Original Message-----
> > From: r-help-bounces at stat.math.ethz.ch [mailto:r-help-
> > bounces at stat.math.ethz.ch] On Behalf Of Duncan Murdoch
> > Sent: Wednesday, May 04, 2005 3:32 PM
> > To: Gabor Grothendieck
> > Cc: mingan; r-help at stat.math.ethz.ch; Huntsinger,Reid
> > Subject: Re: [R] rank of a matrix
> >
> > Gabor Grothendieck wrote:
> > > In this case, try a lower tolerance (1e-7 is the default):
> > >
> > >
> > >>qr(hilbert(9), tol = 1e-8)\$rank
> > >
> > > [1] 9
> >
> > But don't trust the results.  For example, create a matrix with 4
> > identical copies of hilbert(9).  This still has rank 9.  It's hard to
> > find, though:
> >
> >  > h9 <- hilbert(9)
> >  > temp <- cbind(h9, h9)
> >  > h9times4 <- rbind(temp, temp)
> >  >
> >  > qr(h9times4,tol=1e-7)\$rank
> > [1] 7
> >  > qr(h9times4, tol=1e-8)\$rank
> > [1] 10
> >  > qr(h9times4, tol=1e-9)\$rank
> > [1] 11
> >  > qr(h9times4, tol=1e-10)\$rank
> > [1] 12
> >
> >
> > There's a tolerance that gives the right answer (1.5e-8 works for me),
> > but how would I know that in a real problem where I didn't already know
> > the answer?
> >
> > Duncan Murdoch
> >
> > ______________________________________________
> > R-help at stat.math.ethz.ch mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide! http://www.R-project.org/posting-
> > guide.html
>

```