読者です 読者をやめる 読者になる 読者になる

R言語勉強メモ(ベクトルと行列)

Rによるやさしい統計学』でなおも勉強中。第1部「基礎編」を読み終わり、第2部「応用編」に入ったところ。第2部冒頭の行列とデータフレームのあたりが分かれば、放ってあったU.リゲス著『Rの基礎とプログラミング技法』を読むのが楽になるかも。Javaで言うところのgetterとsetterを、例えば「rowname(A)」「rowname(A) <- "hoge"」と表現するなど、ちょっと不思議な感じ*1がするけれど、僕にとっては新鮮で面白い。言語としてのRがだんだんと面白く感じるようになってきましたよー!

ベクトルの内積

c(1,2,3) %*% c(4,5,6)

%*%ではなく*を使うと要素どうしのかけ算になる。要素数が異なっているときには警告が出る。でも行列の先頭から順に、計算できるところまでは計算する。

行列

作り方

行列の元となる数列を用意して、それをnrowとncolで指定した大きさの行列に並べて箱詰めしていくイメージ。nrowとncolで指定した大きさに関わらず、column vector優先で箱詰め。

> matrix(1:12, nrow=4)
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12
> matrix(1:12, ncol=3)
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12

ただしbyrow=TRUEを指定すると、row vector優先で箱詰め。

> matrix(1:12, ncol=3, byrow=TRUE)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
[4,]   10   11   12
行列の積
matrix(1:10,nrow=2) %*% matrix(-4:5,nrow=5)

ここでも%*%ではなく*を使うと要素どうしのかけ算になる。ただしベクトルとは違い行列の大きさを等しくする必要がある。

行列のラベル
rownames(hoge) <- c("row1", "row2", ...)
colnames(hoge) <- c("col1", "col2", ...)

とすると、行と列それぞれにラベルが付けられる。*2

行列の要素のアクセス
> A <- matrix(sample(1:100), nrow=10)
> A[2:7,c(5,8)]
     [,1] [,2]
[1,]   42   39
[2,]    9   70
[3,]   44   45
[4,]    3   64
[5,]   54   81
[6,]   18   28
行列の転置・行列式逆行列固有値固有ベクトル
> A <- matrix(c(5,3,2,5,1,6,7,5,4),nrow=3)
> A
     [,1] [,2] [,3]
[1,]    5    5    7
[2,]    3    1    5
[3,]    2    6    4
> t(A)
     [,1] [,2] [,3]
[1,]    5    3    2
[2,]    5    1    6
[3,]    7    5    4
> det(A)
[1] -28
> solve(A)
            [,1]       [,2]       [,3]
[1,]  0.92857143 -0.7857143 -0.6428571
[2,]  0.07142857 -0.2142857  0.1428571
[3,] -0.57142857  0.7142857  0.3571429
> eigen(A)
$values
[1] 12.2605965 -3.0174424  0.7568459

$vectors
           [,1]       [,2]         [,3]
[1,] -0.7629222 -0.1205955 -0.857636242
[2,] -0.4210745 -0.7372713  0.007942884
[3,] -0.4905568  0.6647463  0.514195476

同様に特異値分解なんかも涙出るほど簡単。

> svd(A)
$d
[1] 13.3062943  3.5483593  0.5930254

$u
           [,1]       [,2]       [,3]
[1,] -0.7459893 -0.1595444 -0.6465644
[2,] -0.4074780 -0.6585751  0.6326457
[3,] -0.5267463  0.7354077  0.4262792

$v
           [,1]       [,2]        [,3]
[1,] -0.4513558 -0.3671082 -0.81333236
[2,] -0.5484549  0.8331031 -0.07166895
[3,] -0.7039000 -0.4137279  0.57736820

*1:C言語の関数呼び出しと同じ形をしているけれど、単にポインタ参照しているだけかもしれない。

*2:どうやらmatrixは2次元までしか扱えないっぽいけれど、arrayを使うと多次元配列が作れそう。