「R」学習(3)行列の作成と計算

2016年4月4日 月曜日 曇り

データ解析環境「R」

参考文献 船尾・高浪 データ解析環境「R」 工学社 2005年

*****

行列の作成(船尾・高浪 p91 参照)

「R」では、以下の手順で行列を作ることができる。
1)行列の要素をベクトルで用意する
2)関数 matrix(ベクトル,行数,列数)で、ベクトルから行列に変換する。

たとえば、1から12までの自然数のベクトルを変換して3×4の行列を作ると・・
> matrix (1:12, nrow=3, ncol=4)
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12

引数 byrow=T とすることで、要素を埋める順番が変わる。
> matrix (1:12, nrow=3, ncol=4, byrow=T)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12

byrow=T に慣れた方が良い。

matrix( c(1,2,3,4,
5,6,7,8,
9,10,11,12), nrow=3, ncol=4, byrow=T) と打ち込むと、ちゃんと以下のような行列にしてくれる。改行のところに入っている+の記号は「R」が入れてくれるものなので、自分で入れる必要はない。また、ncol=4 は省略可能。改行を入れる際に、数字の後にコンマを入れるのを忘れないよう要注意。また、c()のcは小文字でないとダメ。つい大文字で入力して、どこがまちがったのか見つけられなかった経験が(今日)あった。
> matrix( c(1,2,3,4,
+ 5,6,7,8,
+ 9,10,11,12), nrow=3, ncol=4, byrow=T)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12

上記はベクトルの途中で改行を入れているが、もちろん、改行を入れなくてもよい。すなわち、以下の通り。
> matrix( c(1,2,3,4,5,6,7,8,9,10,11,12), nrow=3, ncol=4, byrow=T)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
>

補注  byrow=T の意味:
 行列「x」についてx[k]で指定する場合、要素はまず1列目の上から順に「1,2,・・・」次に2列目の上から順に・・と番号が付けられている。(同書、p92)
 ネットで調べてみると TはTRUEの略記。関数matrixに引数 byrow=T (あるいは byrow=TRUE) を加えるとデータが横の順に並べられた行列になる。
 matrix()という関数の byrow という引数がデフォルト(初期設定)で byrow= FALSE となるように作られている。したがって、「byrow=T」は行から埋めてゆくことを表す。

この辺は約束事と考えて慣れるとよいのだろう。

*****

行列の計算
行列の和、差、積、は普通の数値と同じコマンドで計算することができる。ただし、積の計算は演算子*ではなく、%*% を使う。もし演算子*を用いると、それぞれの行列の対応する要素ごとの積を計算する。ためしに3行3列の行列で計算を行った結果は、以下の通り。

> A < - matrix( c(1,2,3,4,5,6,7,8,9), nrow=3, ncol=3, byrow=T) #[nrowは省略可能] > A
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
> A + A
[,1] [,2] [,3]
[1,] 2 4 6
[2,] 8 10 12
[3,] 14 16 18
> A – A
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 0 0 0
> A %*% A
[,1] [,2] [,3]
[1,] 30 36 42
[2,] 66 81 96
[3,] 102 126 150
> A * A
[,1] [,2] [,3]
[1,] 1 4 9
[2,] 16 25 36
[3,] 49 64 81
>

行列計算用として用意されている関数(同書、p94)のうちからいくつか実際に計算させてみると・・・

eigen(A) 固有値と固有ベクトルを求める。
> A < - matrix( c(1,2,3,4,5,6,7,8,9), nrow=3, ncol=3, byrow=T) #[nrowは省略可能] > A
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
> eigen(A)
$values
[1] 1.611684e+01 -1.116844e+00 -1.303678e-15

$vectors
[,1] [,2] [,3]
[1,] -0.2319707 -0.78583024 0.4082483
[2,] -0.5253221 -0.08675134 -0.8164966
[3,] -0.8186735 0.61232756 0.4082483

逆行列はエラー。
> solve(A)
solve.default(A) でエラー:
システムは数値的に特異です: 条件数の逆数 = 1.54198e-18

t(A) 行列Aの転置
> t(A)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
>

逆行列が求められるように、参考書に載っている行列を使ってみると・・・参考書に載っているのと同じ答えを誘導できた。
> A < - matrix (1:4, nrow=2, byrow=T) > A
[,1] [,2]
[1,] 1 2
[2,] 3 4
> solve(A)
[,1] [,2]
[1,] -2.0 1.0
[2,] 1.5 -0.5

*****

**********