行列XをQR分解で行列Qと行列Rに分解することを考える。
X = Q R
行列QはQTQ=I(Iは単位行列)となる直交行列。行列Rは上三角行列(対角成分はすべて0以外で、対角成分より下の要素はすべて0)。
qr.Q関数、qr.R関数を使うと、それぞれQR分解した際の行列Qと行列Rが得られる。引数にはqrオブジェクトを与える必要があり、qr関数を使ってあらかじめ分解したい行列Xからqrオブジェクトを作成しておく必要がある。
> d <- c(1, 2, 3, 4, 5, 6, 9, 9, 8)
> x <- matrix(d, 3, 3, byrow = TRUE)
> x
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 9 9 8
> objqr <- qr(x)
> q <- qr.Q(objqr)
> q
[,1] [,2] [,3]
[1,] -0.1010153 -0.7184092 -0.6882472
[2,] -0.4040610 -0.6025367 0.6882472
[3,] -0.9091373 0.3476173 -0.2294157
> r <- qr.R(objqr)
> r
[,1] [,2] [,3]
[1,] -9.899495 -10.404571 -10.0005102
[2,] 0.000000 -1.320946 -2.9895090
[3,] 0.000000 0.000000 0.2294157
QTQ = I となるか試す。
> t(q) %*% q
[,1] [,2] [,3]
[1,] 1.000000e+00 -1.110223e-16 -1.665335e-16
[2,] -1.110223e-16 1.000000e+00 -9.714451e-17
[3,] -1.665335e-16 -9.714451e-17 1.000000e+00
qr.X関数を使うことで、qrオブジェクトの元の行列を取り出すことができる。
> qr.X(objqr)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 9 9 8