2017-12-01 5 views
1

matlab関数をRに変換することについて質問があり、誰かが助けてくれることを期待していました。Rとmatlabのqr関数

matlabとRの両方で使用される標準QR分解はqr()と呼ばれます。私の理解に、両方の言語で、QR分解を行うための標準的な方法は次のとおりです。

Matlabの:

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

を私に提供どちらも: [Q,R] = qr(A) QRは

Rを=満たします同じ結果、残念ながら、これは私が必要なものではありません。私は必要がこれです:

Matlabの:、E: [Q、R、E]はeは置換ベクターである、経済サイズ分解生成QR(A、0)を= A(そのよう)= Q * Rとなる。

R: 手掛かり

Iはを比較しようとしている[Q、R、E]は

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

とQR(A)を=その結果を(変数Q及びEに対して同一に見えるが、 Rとは異なる)。したがって、定義された入力/出力に応じて、異なる結果が得られます(意味があります)。

だから私の質問は次のとおりです。 この[Q、R、E]は、MATLABでQR(A、0)=模倣することができますRにおける方法はありますか?

私はmatlab関数を掘り下げようとしましたが、無限の関数定義の長い道のりにつながりました。もっと良い解決策を望んでいました。

何か助けていただければ幸いです。私が何か明白なことを見逃してしまった場合は、お詫び申し上げます。

答えて

0

私は計算の基礎となる数値ライブラリに違いがあると思います。デフォルトでは、Rのqr機能は、(非常に古い)LINPACKルーチンを使用していますが、私は

z <- qr(X,LAPACK=T) 

を行うならば、Rは、LAPACKを使用し、結果は(おそらく下LAPACKを使用している)MATLABの一致するように見えます。いずれにしても、期待される関係は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