行列

Julia では 2 次元配列を行列として扱うことができる。

行列の作成と要素の取り出し方

Julia で行列を作成するとき reshape 関数を利用する。1 つ目の引数には行列の要素を代入し、2 つ目と 3 つ目の引数には行数と列数を指定する。Julia における行列の取り扱い方も表示に R に近い。

a = reshape(1:20, 4, 5)
## 4x5 Array{Int64,2}:
##  1  5   9  13  17
##  2  6  10  14  18
##  3  7  11  15  19
##  4  8  12  16  20

a[4]
## 4

a[2:3, 4:5]
## 2x2 Array{Int64,2}:
##  14  18
##  15  19

a[1, :]
## 1x5 Array{Int64,2}:
##  1  5  9  13  17

a[:, 1:3]
## 4x3 Array{Int64,2}:
##  1  5   9
##  2  6  10
##  3  7  11
##  4  8  12

a[1:2, 1:3] = 0
a
## 4x5 Array{Int64,2}:
##  0  0   0  13  17
##  0  0   0  14  18
##  3  7  11  15  19
##  4  8  12  16  20

2 つの 1 次元配列(ベクトル)を並べて行列を作成する場合は以下のようにする。


v = [1, 3, 5]
u = [2, 4, 6]

[[u], [v]]
## 6-element Array{Int64,1}:
##  2
##  4
##  6
##  1
##  3
##  5

[[u] [v]]
## 3x2 Array{Int64,2}:
##  2  1
##  4  3
##  6  5

transpose([[u] [v]])
## 2x3 Array{Int64,2}:
##  2  4  6
##  1  3  5

行列計算

行列同士の計算について、以下のように行うことができる。行列中の各要素同士の積は .* を利用して計算する。また、内積は * を利用して計算する。

a = reshape([1, 2, 3, 4], 2, 2)
## 2x2 Array{Int64,2}:
##  1  3
##  2  4

b = reshape([1, 0, 0, 1], 2, 2)
## 2x2 Array{Int64,2}:
##  1  0
##  0  1


a + b
## 2x2 Array{Int64,2}:
##  2  3
##  2  5

a - b
## 2x2 Array{Int64,2}:
##  0  3
##  2  3

a .* b
## 2x2 Array{Int64,2}:
##  1  0
##  0  4

a * b
## 2x2 Array{Int64,2}:
##  1  3
##  2  4

2 つの行列の結合

行列の結合は vcat または hcat 関数を利用する。それぞれ R の rbindcbind に対応する。

a = reshape([1, 2, 3, 4], 2, 2)
b = reshape([1, 0, 0, 1], 2, 2)

vcat(a, b)
## 4x2 Array{Int64,2}:
##  1  3
##  2  4
##  1  0
##  0  1

hcat(a, b)
## 2x4 Array{Int64,2}:
##  1  3  1  0
##  2  4  0  1

行列の並べ替え

行列のある列の要素に基づいて並べ替える時は sortperm 関数を利用する。

x = reshape(rand(16), 4, 4)
## 4x4 Array{Float64,2}:
##  0.796168  0.0613345  0.153774  0.211966
##  0.620388  0.121865   0.370927  0.035317
##  0.695066  0.104074   0.543899  0.915831
##  0.595788  0.682693   0.922134  0.734565

x[sortperm(x[:, 1]), :]
## 4x4 Array{Float64,2}:
##  0.595788  0.682693   0.922134  0.734565
##  0.620388  0.121865   0.370927  0.035317
##  0.695066  0.104074   0.543899  0.915831
##  0.796168  0.0613345  0.153774  0.211966

データの特徴量の計算(合計、平均など)

行列の列または行の合計、平均などの特徴量はベクトルのときと同様に summean などの関数を利用する。ただし、第 2 引数には計算する次元を与える必要がある。

y = reshape(1:12, 3, 4)
## 3x4 Array{Int64,2}:
##  1  4  7  10
##  2  5  8  11
##  3  6  9  12

sum(y, 1)
## 1x4 Array{Int64,2}:
##  6  15  24  33

sum(y, 2)
## 3x1 Array{Int64,2}:
##  22
##  26
##  30

mean(y, 1)
## 1x4 Array{Float64,2}:
##  2.0  5.0  8.0  11.0

var(y, 2)
## 3x1 Array{Float64,2}:
##  15.0
##  15.0
##  15.0

References

  • Introducing Julia/Arrays and tuples. WIKIBOOKS