QR分解したい

行列のQR分解をやりたいと思って調べたら、qr関数ってのがその名の通りあるのでこれだけでやってくれるんじゃないかと期待したがqr関数の結果はqrクラスのオブジェクトになってて、これを

  • qr.Q関数:Q行列の取得
  • qr.R関数:R行列の取得

のそれぞれの関数に食わせる事ではじめてQ・R行列がそれぞれ取得できるようになってる作りのようだ。

> x <- matrix(1:36, 9)
> x
      [,1] [,2] [,3] [,4]
 [1,]    1   10   19   28
 [2,]    2   11   20   29
 [3,]    3   12   21   30
 [4,]    4   13   22   31
 [5,]    5   14   23   32
 [6,]    6   15   24   33
 [7,]    7   16   25   34
 [8,]    8   17   26   35
 [9,]    9   18   27   36
> x.qr <- qr(x)
> qr.Q(x.qr)
             [,1]        [,2]        [,3]        [,4]
 [1,] -0.05923489 -0.61177529 -0.27429230 -0.28210573
 [2,] -0.11846978 -0.49706742 -0.31040198 -0.16235610
 [3,] -0.17770466 -0.38235956  0.89921377 -0.07293905
 [4,] -0.23693955 -0.26765169 -0.08696728  0.92491977
 [5,] -0.29617444 -0.15294382 -0.07314834 -0.07722141
 [6,] -0.35540933 -0.03823596 -0.05932939 -0.07936260
 [7,] -0.41464421  0.07647191 -0.04551044 -0.08150378
 [8,] -0.47387910  0.19117978 -0.03169149 -0.08364496
 [9,] -0.53311399  0.30588765 -0.01787254 -0.08578614
> qr.R(x.qr)
          [,1]      [,2]          [,3]          [,4]
[1,] -16.88194 -40.87207 -6.486220e+01 -8.885233e+01
[2,]   0.00000 -12.38845 -2.477690e+01 -3.716535e+01
[3,]   0.00000   0.00000  4.296762e-15  6.225828e-15
[4,]   0.00000   0.00000  0.000000e+00  6.792110e-15
> qr.Q(x.qr) %*% qr.R(x.qr)
      [,1] [,2] [,3] [,4]
 [1,]    1   10   19   28
 [2,]    2   11   20   29
 [3,]    3   12   21   30
 [4,]    4   13   22   31
 [5,]    5   14   23   32
 [6,]    6   15   24   33
 [7,]    7   16   25   34
 [8,]    8   17   26   35
 [9,]    9   18   27   36