qr function in R and matlab

好久不见. 提交于 2020-05-15 04:44:39

问题


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.


回答1:


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


来源:https://stackoverflow.com/questions/47596598/qr-function-in-r-and-matlab

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!