I agree the result is a little confusing, but the behavior is in line with the documentation and so not ‘unexpected’ as such...
I don’t think this is a matter of semantics, more of a ‘return the rank when we have it for free’ situation—when A is real-valued, qr(A,LAPACK=false) calls a modified version of Linpack’s dqrdc which computes the rank internally; see dqrdc2.f, output ‘k’. Lapack’s dqeqp3 doesn’t return the rank as is. Just my 2 cents on a potential fix: Matrix::rankMatrix follows the logic of your code, and I think this would be simpler to implement than modifying Lapack.c in two places (around lines 657 and 1175). Keith > On Jan 22, 2018, at 11:57 AM, Serguei Sokol <so...@insa-toulouse.fr> wrote: > > Le 22/01/2018 à 17:40, Keith O'Hara a écrit : >> This behavior is noted in the qr documentation, no? >> >> rank - the rank of x as computed by the decomposition(*): always full rank >> in the LAPACK case. > For a me a "full rank matrix" is a matrix the rank of which is indeed > min(nrow(A), ncol(A)) > but here the meaning of "always is full rank" is somewhat confusing. Does it > mean > that only full rank matrices must be submitted to qr() when LAPACK=TRUE? > May be there is a jargon where "full rank" is a synonym of min(nrow(A), > ncol(A)) for any matrix > but the fix to stick with commonly admitted rank definition (i.e. the number > of linearly independent > columns in A) is so easy. Why to discard lapack case from it (even properly > documented)? > >> >> >> >>> On Jan 22, 2018, at 11:21 AM, Serguei Sokol <so...@insa-toulouse.fr> wrote: >>> >>> Hi, >>> >>> I have noticed different rank values calculated by qr() depending on >>> LAPACK parameter. When it is FALSE (default) a true rank is estimated and >>> returned. >>> Unfortunately, when LAPACK is set to TRUE, the min(nrow(A), ncol(A)) is >>> returned >>> which is only occasionally a true rank. >>> >>> Would not it be more consistent to replace the rank in the latter case by >>> something >>> based on the following pseudo code ? >>> >>> d=abs(diag(qr)) >>> rank=sum(d >= d[1]*tol) >>> >>> Here, we rely on the fact column pivoting is activated in the called lapack >>> routine (dgeqp3) >>> and diagonal term in qr matrix are put in decreasing order (according to >>> their absolute values). >>> >>> Serguei. >>> >>> How to reproduce: >>> >>> a=diag(2) >>> a[2,2]=0 >>> qaf=qr(a, LAPACK=FALSE) >>> qaf$rank # shows 1. OK it's the true rank value >>> qat=qr(a, LAPACK=TRUE) >>> qat$rank #shows 2. Bad, it's not the expected value. >>> >>> ______________________________________________ >>> R-devel@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel >> > > -- > Serguei Sokol > Ingenieur de recherche INRA > > Cellule mathématique > LISBP, INSA/INRA UMR 792, INSA/CNRS UMR 5504 > 135 Avenue de Rangueil > 31077 Toulouse Cedex 04 > > tel: +33 5 6155 9849 > email: so...@insa-toulouse.fr <mailto:so...@insa-toulouse.fr> > http://www.lisbp.fr <http://www.lisbp.fr/> [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel