qr関数を使う。分解した行列はqr関数の戻り値からそれぞれqr.Q関数、qr.R関数を使うことで得ることができる。
m行n列の行列A(m >= n)が与えられたとき、Q^T Q = Iを満たす行列Qと上三角行列(対角成分より下の成分はすべて0の行列)Rを用いてA = Q Rと分解することを、行列AのQR分解という。QR分解はcomplete型とreduced型の2種類があり、それぞれ分解した行列の行数と列数が異なる。
complete型 A(m×n) = Q(m×m) R(m×n)
reduced型 A(m×n) = Q(m×n) R(n×n)
以下は適当な行列を作成してQR分解した例。Q^T Q = Iを満たしていることと、Q R = Aと元に戻ることも計算している。qr.Q関数とqr.R関数にそれぞれcompleteオプションにTRUEを指定すると、complete型の計算を行う。何も指定しなければreduced型の計算結果が返される。
> m <- 4
> n <- 3
> aa <- matrix(0.0, m, n)
> for (i in 1:m) for (j in 1:n) aa[i, j] <- (-1) ^ i * choose(2 * i + j, i)
> print(aa)
[,1] [,2] [,3]
[1,] -3 -4 -5
[2,] 10 15 21
[3,] -35 -56 -84
[4,] 126 210 330
>
> # complete型 A(m×n) = Q(m×m) R(m×n)
> r <- qr(aa)
> qq <- qr.Q(r, complete = TRUE) # m×m
> rr <- qr.R(r, complete = TRUE) # m×n
> print(qq)
[,1] [,2] [,3] [,4]
[1,] -0.02286814 0.3344769 0.7843075 0.5219808
[2,] 0.07622713 -0.5474374 -0.2854080 0.7829713
[3,] -0.26679495 0.7243109 -0.5399946 0.3355591
[4,] 0.96046183 0.2526086 -0.1086731 0.0434984
> print(rr)
[,1] [,2] [,3]
[1,] 131.1869 217.872381 341.0782902
[2,] 0.0000 2.936931 9.3501598
[3,] 0.0000 0.000000 -0.4176769
[4,] 0.0000 0.000000 0.0000000
> print(t(qq) %*% qq)
[,1] [,2] [,3] [,4]
[1,] 1.000000e+00 -8.326673e-17 -2.220446e-16 -7.632783e-17
[2,] -8.326673e-17 1.000000e+00 9.714451e-17 2.775558e-17
[3,] -2.220446e-16 9.714451e-17 1.000000e+00 1.257675e-16
[4,] -7.632783e-17 2.775558e-17 1.257675e-16 1.000000e+00
> print(qq %*% rr)
[,1] [,2] [,3]
[1,] -3 -4 -5
[2,] 10 15 21
[3,] -35 -56 -84
[4,] 126 210 330
>
> # reduced型 A(m×n) = Q(m×n) R(n×n)
> r <- qr(aa)
> qq <- qr.Q(r) # m×n
> rr <- qr.R(r) # n×n
> print(qq)
[,1] [,2] [,3]
[1,] -0.02286814 0.3344769 0.7843075
[2,] 0.07622713 -0.5474374 -0.2854080
[3,] -0.26679495 0.7243109 -0.5399946
[4,] 0.96046183 0.2526086 -0.1086731
> print(rr)
[,1] [,2] [,3]
[1,] 131.1869 217.872381 341.0782902
[2,] 0.0000 2.936931 9.3501598
[3,] 0.0000 0.000000 -0.4176769
> print(t(qq) %*% qq)
[,1] [,2] [,3]
[1,] 1.000000e+00 -8.326673e-17 -2.220446e-16
[2,] -8.326673e-17 1.000000e+00 9.714451e-17
[3,] -2.220446e-16 9.714451e-17 1.000000e+00
> print(qq %*% rr)
[,1] [,2] [,3]
[1,] -3 -4 -5
[2,] 10 15 21
[3,] -35 -56 -84
[4,] 126 210 330
qr関数にLAPACKオプションでTRUEを指定すると(デフォルトはFALSE)、計算にLAPACKを使いピボット選択が行われる(Using LAPACK (including in the complex case) uses column pivoting and does not attempt to detect rank-deficient matrices.)。このピボットの情報は、qr関数の戻り値のpivotというベクトルに含まれている。
> print(aa)
[,1] [,2] [,3]
[1,] -3 -4 -5
[2,] 10 15 21
[3,] -35 -56 -84
[4,] 126 210 330
> r <- qr(aa, LAPACK = TRUE)
> print(r$pivot)
[1] 3 1 2
> qq <- qr.Q(r)
> rr <- qr.R(r)
> print(qq)
[,1] [,2] [,3]
[1,] -0.01465387 0.2996579 0.7984525
[2,] 0.06154627 -0.5360454 -0.3095536
[3,] -0.24618510 0.7547242 -0.5071335
[4,] 0.96715574 0.2307639 -0.0972919
> print(rr)
[,1] [,2] [,3]
[1,] 341.2067 131.137526 217.8708796
[2,] 0.0000 -3.598527 -3.0434558
[3,] 0.0000 0.000000 0.1310637
> print(t(qq) %*% qq)
[,1] [,2] [,3]
[1,] 1.000000e+00 5.551115e-17 1.387779e-16
[2,] 5.551115e-17 1.000000e+00 -9.020562e-17
[3,] 1.387779e-16 -9.020562e-17 1.000000e+00
> print(aa[, r$pivot])
[,1] [,2] [,3]
[1,] -5 -3 -4
[2,] 21 10 15
[3,] -84 -35 -56
[4,] 330 126 210
> print(qq %*% rr)
[,1] [,2] [,3]
[1,] -5 -3 -4
[2,] 21 10 15
[3,] -84 -35 -56
[4,] 330 126 210