2017-06-22 19:49 GMT+02:00 Uwe Ligges <ligges at statistik.tu-dortmund.de>:> On 22.06.2017 17:11, Bernd Funovits wrote: >> >> Hello, >> >> I experienced some unexpected behaviour while determining the rank of matrices (sometimes 1x1 matrices): >> base::qr(matrix(1e-20))$rank returns 1 (incorrect) >> base::qr(diag(c(1, 1e-20)))$rank returns 2 (incorrect) > > > Why do you believe this is incorrect? > > 0 != 1e-20 > > and 1e-20 is well representable without significant rounding errors given > > > .Machine$double.xmin > [1] 2.225074e-308 > > > Best, > Uwe Liggesqr() has a tolerance argument which by default is tol=1e-07. Regards, I?aki
On 22.06.2017 20:09, I?aki ?car wrote:> 2017-06-22 19:49 GMT+02:00 Uwe Ligges <ligges at statistik.tu-dortmund.de>: >> On 22.06.2017 17:11, Bernd Funovits wrote: >>> >>> Hello, >>> >>> I experienced some unexpected behaviour while determining the rank of matrices (sometimes 1x1 matrices): >>> base::qr(matrix(1e-20))$rank returns 1 (incorrect) >>> base::qr(diag(c(1, 1e-20)))$rank returns 2 (incorrect) >> >> >> Why do you believe this is incorrect? >> >> 0 != 1e-20 >> >> and 1e-20 is well representable without significant rounding errors given >> >>> .Machine$double.xmin >> [1] 2.225074e-308 >> >> >> Best, >> Uwe Ligges > > qr() has a tolerance argument which by default is tol=1e-07.But the tolerance is not about the size of the values! It is about the reduction of the norm during the householder transformation. From the sources <https://svn.r-project.org/R/trunk/src/appl/dqrdc2.f> c cycle the columns from l to p left-to-right until one c with non-negligible norm is located. a column is considered c to have become negligible if its norm has fallen below c tol times its original norm.... Best, Uwe Ligges> > Regards, > I?aki >
2017-06-22 20:31 GMT+02:00 Uwe Ligges <ligges at statistik.tu-dortmund.de>:> > > On 22.06.2017 20:09, I?aki ?car wrote: >> >> 2017-06-22 19:49 GMT+02:00 Uwe Ligges <ligges at statistik.tu-dortmund.de>: >>> >>> On 22.06.2017 17:11, Bernd Funovits wrote: >>>> >>>> >>>> Hello, >>>> >>>> I experienced some unexpected behaviour while determining the rank of >>>> matrices (sometimes 1x1 matrices): >>>> base::qr(matrix(1e-20))$rank returns 1 (incorrect) >>>> base::qr(diag(c(1, 1e-20)))$rank returns 2 (incorrect) >>> >>> >>> >>> Why do you believe this is incorrect? >>> >>> 0 != 1e-20 >>> >>> and 1e-20 is well representable without significant rounding errors given >>> >>>> .Machine$double.xmin >>> >>> [1] 2.225074e-308 >>> >>> >>> Best, >>> Uwe Ligges >> >> >> qr() has a tolerance argument which by default is tol=1e-07. > > > But the tolerance is not about the size of the values! It is about the > reduction of the norm during the householder transformation. From the > sources <https://svn.r-project.org/R/trunk/src/appl/dqrdc2.f> > > > c cycle the columns from l to p left-to-right until one > c with non-negligible norm is located. a column is considered > c to have become negligible if its norm has fallen below > c tol times its original norm.... > > Best, > Uwe LiggesOh, I apologise, I read the arguments section in the help page, but not the asterisk down below. Then the result is ok. Sorry for the noise. Regards, I?aki