R による行列の演算

行列

R の行列は数学の行列とほぼ同じ概念である。行と列からなる、2 次元配置のデータである。2 次元配置のデータ型は、行列のほかに、データフレームもある。行列について、行列に含まれるすべての要素が同じ属性を持つ必要がある。例えば、行列は、すべて実数、あるいはすべて文字列で構成されている。これに対して、データフレームは、列ごとに属性を持つことができる。例えば、データフレームの 1 列目は実数、2 列目は文字列のようにデータを保存することができる。

行列の作成

行列は matrix 関数に行列の要素、列数、行数を指定して作成する。

matrix(1:9, nrow = 3, ncol = 3)
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9

matrix(1:9, nrow = 3, ncol = 3, byrow = T)
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9

行列の行と列に名前を付けることができる。

m <- matrix(1:12, nrow = 3, ncol = 4)

colnames(m) <- c("A", "B", "C", "D")
rownames(m) <- c("first", "second", "third")

m
##        A B C  D
## first  1 4 7 10
## second 2 5 8 11
## third  3 6 9 12

行列の要素

行列から要素を取り出すとき、角括弧を利用して、行数と列数を指定して行う。行数と列数を複数指定することで、複数の要素を取り出すことができる。また、行数だけを指定して、列数を両略する場合は、指定された行の行ベクトルを取得できる。

x <- matrix(c(1:16), nrow = 4, ncol = 4)
x
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    9   13
## [2,]    2    6   10   14
## [3,]    3    7   11   15
## [4,]    4    8   12   16

x[3, 2]
## [1] 7

## x[3, ]
[1]  3  7 11 15

x[-3, ]
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    9   13
## [2,]    2    6   10   14
## [3,]    4    8   12   16

x[c(1,2),c(3,4)]
##      [,1] [,2]
## [1,]    9   13
## [2,]   10   14

行列の行と列に名前が付けられている場合、行名と列名で要素を取得できる。

m <- matrix(1:12, nrow = 3, ncol = 4)
colnames(m) <- c("A", "B", "C", "D")
rownames(m) <- c("first", "second", "third")

m[, "D"]
##  first second  third 
##     10     11     12

m[c("first", "second"), c("B", "C", "D")]
##        B C  D
## first  4 7 10
## second 5 8 11

行列の計算

入力式意味
--A各成分に(-1)をかける。逆行列を計算しているわけではない。
*A * B各成分をそれぞれ個別に積をとる。すなわち、aij*bijを計算している。行列の積を計算しているわけではない。
%*%A %*% B行列 A と行列 B の積。すなわち、Σaij*bji を計算している。
+A + B行列 A と行列 B の和。
-A - B行列 A と行列 B の差。
A <- matrix(1:9, 3, 3)
B <- matrix(1:9, 3, 3)

A + B
##     [,1] [,2] [,3]
## [1,]    2    8   14
## [2,]    4   10   16
## [3,]    6   12   18

A * B 
##      [,1] [,2] [,3]
## [1,]    1   16   49
## [2,]    4   25   64
## [3,]    9   36   81

A %*% B 
##      [,1] [,2] [,3]
## [1,]   30   66  102
## [2,]   36   81  126
## [3,]   42   96  150

固有値や逆行列は、R の関数で計算する。

意味
rowSums(x)行列 x の各行の総和
solSums(x)行列 x の各列の総和
rowMeans(x)行列 x の各行の平均
colMeans(x)行列 x の各列の平均
t(x)行列 x を転置
solve(x)行列 x の逆行列
diag(n)n 行 n 列の単位行列
diag(a1:an)対角成分が (a1, a2, …, an) の対角行列
x[upper.tri(x)] <- n対角成分を除く上三角成分をすべて n に置換
x[lower.tri(x)] <- n対角成分を除く下三角成分をすべて n に置換
sum(x^n)行列 x の n 乗積
crossprod(x)行列 x のベクトル積
crossprod(x,y)行列 x と行列yの内積
eigen(x)行列 x の固有値と固有ベクトル
det(x)行列 x の行列式
X <- diag(1:3)

X
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    2    0
## [3,]    0    0    3
## X[upper.tri(X)] <- 4

X
##      [,1] [,2] [,3]
## [1,]    1    4    4
## [2,]    0    2    4
## [3,]    0    0    3

det(X)
## [1] 6

eigen(X)
## $values
## [1] 3 2 1
## $vectors
##            [,1]      [,2] [,3]
## [1,] 0.92450033 0.9701425    1
## [2,] 0.36980013 0.2425356    0
## [3,] 0.09245003 0.0000000    0

solve(X)
##      [,1] [,2]       [,3]
## [1,]    1 -2.0  1.3333333
## [2,]    0  0.5 -0.6666667
## [3,]    0  0.0  0.3333333

行列の結合

2 つの行列を、横方向で結合するとき(列の結合)は cbind 関数を使う。2 つの行列を、縦方向で結合するとき(行の結合)は rbind 関数を使う。

a <- matrix(1:9, 3, 3)
b <- matrix(11:19, 3, 3)

rbind(a, b)
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
## [4,]   11   14   17
## [5,]   12   15   18
## [6,]   13   16   19

cbind(a, b)
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    4    7   11   14   17
## [2,]    2    5    8   12   15   18
## [3,]    3    6    9   13   16   19