Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

qr function in R and matlab

I have a question about converting a matlab function into R, and I was hoping that someone could help.

The standard QR decomposition used in both matlab and R is referred to as qr(). To my understanding, the standard way of performing a qr decomposition in both languages is:

Matlab: [Q,R] = qr(A) satisfying QR=A

R:

z <- qr(A)
Q <- qr.Q(z)
R <- qr.R(z)

Both of which provide me with the same results, unfortunately, this is not what I need. What I need is this:

Matlab: [Q,R,e] = qr(A,0) which produces an economy-size decomposition in which e is a permutation vector so that A(:,e) = Q*R.

R: No clue

I have tried comparing [Q,R,E] = qr(A) with

z <- qr(A);
Q <- qr.Q(z);
R <- qr.R(z);
E <- diag(ncol(A))[z$pivot]

and results seem identical for variables Q and E (but different for R). So depending on the defined inputs/outputs there will be different results (which makes sense).

So my question is: Is there a way in R that can mimic this [Q,R,e]=qr(A,0) in Matlab?

I have tried digging into the matlab function but it leads to a long and torturous road of endless function definitions and I was hoping for a better solution.

Any help would be much appreciated, and if I've missed something obvious, I apologize.

like image 217
Ellie Avatar asked Dec 01 '17 15:12

Ellie


1 Answers

I think the difference comes down to the numerical library underlying the calculations. By default, R's qr function uses the (very old) LINPACK routines, but if I do

z <- qr(X,LAPACK=T)

then R uses LAPACK and the results seem to match MATLAB's (which is probably also using LAPACK underneath). Either way we see the expected relationship with X:

z <- qr(X,LAPACK=F)
all.equal(X[,z$pivot], qr.Q(z)%*%qr.R(z), check.attributes=FALSE)
# [1] TRUE

z <- qr(X,LAPACK=T)
all.equal(X[,z$pivot], qr.Q(z)%*%qr.R(z), check.attributes=FALSE)
# [1] TRUE
like image 50
Jon Clayden Avatar answered Sep 20 '22 15:09

Jon Clayden