行列

行列の和と差

まず行列を定義します。 行列は「matrix(行列成分,行数,列数)」として定義します。
> m <- matrix(1:12,3,4)
> m
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
このように成分は列方向から埋められます。行方向から埋めるには 次のように指定します。
> n <- matrix(1:12,3,4,byrow=T)
> n
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
さて、まずスカラー倍します。
> 3*m
     [,1] [,2] [,3] [,4]
[1,]    3   12   21   30
[2,]    6   15   24   33
[3,]    9   18   27   36
行列の和です。
> m+n
     [,1] [,2] [,3] [,4]
[1,]    2    6   10   14
[2,]    7   11   15   19
[3,]   12   16   20   24
行列の差です。
> m-n
     [,1] [,2] [,3] [,4]
[1,]    0    2    4    6
[2,]   -3   -1    1    3
[3,]   -6   -4   -2    0
次に普通の数学では許されない演算ですが、行列にスカラーを足すと各成分に そのスカラーを足したことになります。
> m+1
     [,1] [,2] [,3] [,4]
[1,]    2    5    8   11
[2,]    3    6    9   12
[3,]    4    7   10   13
先ほど行列の成分と行数、列数を指定しましたが、成分が足りないときはどうなるでしょう。
> matrix(1,2,3)
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
> matrix(c(1,2,3,4),3,4)
     [,1] [,2] [,3] [,4]
[1,]    1    4    3    2
[2,]    2    1    4    3
[3,]    3    2    1    4
答えは上二つのように何度も使いまわしをします。

行列の積

次に行列の積です。行列AとBの積ABは「A %*% B」とします。
> a <- matrix(c(1,2,3,4),2,2)
> a
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> b <- matrix(c(5,6,7,8),2,2)
> b
     [,1] [,2]
[1,]    5    7
[2,]    6    8
> a %*% b
     [,1] [,2]
[1,]   23   31
[2,]   34   46
逆の順番でかけたらどうなるでしょう?
> b %*% a
     [,1] [,2]
[1,]   19   43
[2,]   22   50
次の記法は普通の数学と異なっているので注意が必要です。
> a^2
     [,1] [,2]
[1,]    1    9
[2,]    4   16
> a %*% a
     [,1] [,2]
[1,]    7   15
[2,]   10   22
A^2は普通はAAをあらわしますが、Rでは各成分の2乗となるので注意してください。 それでは行列の累乗を表す関数を作ってみましょう。次の中で「diag(次数)」は 指定した次数の単位行列を作ります。
> powmat <- function(A,n){
+ B <- diag(dim(A)[1])
+ for (i in 1:n) B <- A %*% B
+ B
+ }
> powmat(a,2)
     [,1] [,2]
[1,]    7   15
[2,]   10   22
> a %*% a
     [,1] [,2]
[1,]    7   15
[2,]   10   22
2乗については確かですね。3乗についても見てみましょう
> powmat(a,3)
     [,1] [,2]
[1,]   37   81
[2,]   54  118
> a %*% a %*% a
     [,1] [,2]
[1,]   37   81
[2,]   54  118
大丈夫でした。

逆行列

行列式を求めるには「det(行列)」逆行列を求めるには「solve(行列)」とします。
> det(a)
[1] -2
> solve(a)
     [,1] [,2]
[1,]   -2  1.5
[2,]    1 -0.5
逆行列が求まりました。確かめてみましょう。
> solve(a)%*%a
             [,1]          [,2]
[1,] 1.000000e+00 -1.776357e-15
[2,] 2.220446e-16  1.000000e+00
計算誤差が少しありますがほぼ単位行列です。 次に正則でない(逆行列のない)行列についてはどうなるでしょう。
> a <- matrix(1:9,3,3)
> a
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> solve(a)
Error in solve.default(a) : singular matrix `a' in solve
> det(a)
[1] -1.305350e-14
エラーが出ましたし、行列式はほぼ0です。

実数・虚数に対応する行列

次の行列Jのふるまいを見てください。
> J <- matrix(c(0,1,-1,0),2,2)
> powmat(J,2)
     [,1] [,2]
[1,]   -1    0
[2,]    0   -1
> powmat(J,3)
     [,1] [,2]
[1,]    0    1
[2,]   -1    0
> powmat(J,4)
     [,1] [,2]
[1,]    1    0
[2,]    0    1
> powmat(J,5)
     [,1] [,2]
[1,]    0   -1
[2,]    1    0
単位行列をIとかいたときJJ=-I,JJJ=-J,JJJJ=I,JJJJJ=Jとなっています。 このようなふるまいをするものは何かと考えてみると Iを実数1に、Jを虚数単位i a+bi をaI+bJと見ることができます。

基本変形

基本変形の仕方は次のようにします。
> a <- matrix(c(3,5,8,1,4,2,7,9,6),3,3)
> a
     [,1] [,2] [,3]
[1,]    3    1    7
[2,]    5    4    9
[3,]    8    2    6
まずある業のスカラー倍です。行の指定は「行列[行番号,]」とします。
> a[1,] <- 2*a[1,]
> a
     [,1] [,2] [,3]
[1,]    6    2   14
[2,]    5    4    9
[3,]    8    2    6
次に列の入れ替えです。列の指定は「行列[,列番号]」とします。
> w <- a[,3]
> w
[1] 14 9 6
> a[,3] <- a[,2]
> a[,2] <- w
> a
wを一時的な避難場所として使いました。
      [,1] [,2] [,3]
[1,]    6   14    2
[2,]    5    9    4
[3,]    8    6    2
ある行に別の行のスカラー倍を足します。
> a[2,] <- a[2,]+2*a[1,]
> a
     [,1] [,2] [,3]
[1,]    6   14    2
[2,]   17   37    8
[3,]    8    6    2
ある列に別の列のスカラー倍を足します。
> a[,3] <- a[,3]+3*a[,2]
> a
     [,1] [,2] [,3]
[1,]    6   14   44
[2,]   17   37  119
[3,]    8    6   20

行列の変形

今まである行列に行または列を付け加える方法です。
> a <- matrix(1:9,3,3)
> a
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
まず一番右の列にベクトル(1,2,3)の縦ベクトルを付け加えてみましょう。
> b <- c(a,c(1,2,3))
> b
[1] 1 2 3 4 5 6 7 8 9 1 2 3
> dim(b) <- c(3,4)
> b
     [,1] [,2] [,3] [,4]
[1,]    1    4    7    1
[2,]    2    5    8    2
[3,]    3    6    9    3
行列とベクトルを結合の関数c()で並べると行列については縦方向に並べたベクトルと 与えられたベクトルを結合したベクトルになるので、これの次元を指定して行列に 整形します。 次に一番下の行に横ベクトル(1,2,3)を付け加えてみましょう
> d <- t(a)
> d
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
まず行列を転置します。「t(行列)」
> d <- c(d,c(1,2,3))
> d
[1] 1 4 7 2 5 8 3 6 9 1 2 3
> dim(d) <-c(3,4)
> d
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    1
[2,]    4    5    6    2
[3,]    7    8    9    3
あとは先ほどの操作を繰り返します。
> d <-t(d)
> d
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
[4,]    1    2    3
最後に転置して終わりです。

連立方程式

連立方程式
3x+y+2z=23
x-2y+4z=5
-2x+y+7z=8
を解いてみましょう。 行列で表せばAx=b
┌          ┐┌   ┐      ┌    ┐
│ 3   1  2 ││ x │      │ 23 │
│          ││   │      │    │
│ 1  -2  4 ││ y │  =   │  5 │
│          ││   │      │    │
│-2   1  7 ││ z │      │  8 │
└          ┘└   ┘      └    ┘
となります。まず係数の行列を作ります。
> a <- matrix(c(3,1,2,1,-2,4,-2,1,7),3,3,byrow="T")
> a
     [,1] [,2] [,3]
[1,]    3    1    2
[2,]    1   -2    4
[3,]   -2    1    7
解く方法のひとつめはx=A^{-1}bとすることです。
> solve(a) %*% c(23,5,8)
     [,1]
[1,]    5
[2,]    4
[3,]    2
次に行基本変形を利用し消去法で解きます。
> b <- c(a,c(23,5,8))
> dim(b) <- c(3,4)
> b
     [,1] [,2] [,3] [,4]
[1,]    3    1    2   23
[2,]    1   -2    4    5
[3,]   -2    1    7    8
まず(1,1)成分を1にします。
> w <- b[2,]
> b[2,] <- b[1,]
> b[1,] <- w
> b
     [,1] [,2] [,3] [,4]
[1,]    1   -2    4    5
[2,]    3    1    2   23
[3,]   -2    1    7    8
次に残りの1列を0にします。
> b[2,] <- b[2,]-3*b[1,]
> b[3,] <- b[3,]+2*b[1,]
> b
     [,1] [,2] [,3] [,4]
[1,]    1   -2    4    5
[2,]    0    7  -10    8
[3,]    0   -3   15   18
それから(2,2)成分をにします。
> w <- b[3,]
> b[3,] <- b[2,]
> b[2,] <- w
> b
     [,1] [,2] [,3] [,4]
[1,]    1   -2    4    5
[2,]    0   -3   15   18
[3,]    0    7  -10    8
> b[2,] <- b[2,]/(-3)
> b
     [,1] [,2] [,3] [,4]
[1,]    1   -2    4    5
[2,]    0    1   -5   -6
[3,]    0    7  -10    8
2列の下のほうを0にします。
> b[3,] <- b[3,] - 7*b[2,]
> b
     [,1] [,2] [,3] [,4]
[1,]    1   -2    4    5
[2,]    0    1   -5   -6
[3,]    0    0   25   50
(3,3)成分を1にします
> b[3,] <- b[3,]/25
> b
     [,1] [,2] [,3] [,4]
[1,]    1   -2    4    5
[2,]    0    1   -5   -6
[3,]    0    0    1    2
後は右上の方の成分を消していきます。
> b[2,] <- b[2,]+5*b[3,]
> b
     [,1] [,2] [,3] [,4]
[1,]    1   -2    4    5
[2,]    0    1    0    4
[3,]    0    0    1    2
> b[1,] <- b[1,]+2*b[2,]-4*b[3,]
> b
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    5
[2,]    0    1    0    4
[3,]    0    0    1    2
何万次元もの連立方程式が様々な分野で使われていますが、 これを解くためには計算量が格段に少ないという理由で逆行列よりも 消去法の方が使われます。 またRのような使いやすい代わりに計算量の多い高級な言語ではなく、 よりコンピュータの演算部分の動きに近いCやFORTRANの言語で記述します。

ホームヘ