Julia 言語における行列の取り扱い方

行列

Julia 言語には行列の概念はなく、その代わりに行列を 2 次元配列として扱う。2 次元配列に対する操作方法などは、1 次元配列のときとほぼ同じである。

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

2 次元配列(行列)を作成するとき、長さが同じである複数のベクトルを並べて作る方法(hcat)のほかに、ベクトルの指定した行数と列数に折りたたむ方法(reshape)とがある。

a = [1.0, 1.1, 1.2, 1.3]
b = [2.2, 2.4, 2.6, 2.8]
c = [3.9, 3.6, 3.3, 3.1]

m = hcat(a, b, c)
m
## 4×3 Array{Float64,2}:
##  1.0  2.2  3.9
##  1.1  2.4  3.6
##  1.2  2.6  3.3
##  1.3  2.8  3.1

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
m = reshape(a, 3, 4)
## 3×4 Array{Int64,2}:
##  1  4  7  10
##  2  5  8  11
##  3  6  9  12

要素を取り出すときは、添字あるいは真偽からなるベクトルを利用する。

m = reshape(1:20, 4, 5)
m
## 4×5 reshape(::UnitRange{Int64}, 4, 5) with eltype Int64:
##  1  5   9  13  17
##  2  6  10  14  18
##  3  7  11  15  19
##  4  8  12  16  20


m[1:3, 3:5]
## 3×3 Array{Int64,2}:
##   9  13  17
##  10  14  18
##  11  15  19

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

m[[1, 3], [1, 3, 5]]
## 2×3 Array{Int64,2}:
##  1   9  17
##  3  11  19

m[[true, true, false, false], [true, false, true, false, true]]
## 2×3 Array{Int64,2}:
##  1   9  17
##  2  10  18

行列計算

行列に対して、足し算と引き算の他に、各要素間の掛け算や割り算なども計算できる。

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
## 2×2 Array{Float64,2}:
##    1.0  Inf
##  Inf      4.0

行列の内積は . で計算できる。また、行列 a と行列 b の逆行列の内積は / で計算できる。

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
## 2×2 Array{Int64,2}:
##  1  3
##  2  4

a / b  # a * inv(b)
## 2×2 Array{Float64,2}:
##  1.0  3.0
##  2.0  4.0

行列の結合

行列の結合は 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)
x
## 4×4 Array{Float64,2}:
##  0.456915  0.134391  0.990817  0.0907954
##  0.309511  0.2775    0.424465  0.339379
##  0.299795  0.239777  0.749924  0.140049
##  0.467547  0.992123  0.892102  0.946294

s = sortperm(x[:, 1])
## 4-element Array{Int64,1}:
##  3
##  2
##  1
##  4

x[s, :]
## 4×4 Array{Float64,2}:
##  0.299795  0.239777  0.749924  0.140049
##  0.309511  0.2775    0.424465  0.339379
##  0.456915  0.134391  0.990817  0.0907954
##  0.467547  0.992123  0.892102  0.946294

データ統計量の計算

平均や分散などのデータ統計量を計算する関数は Statistics モジュールで定義されている。これらの関数を利用するとき、Statistics モジュールをインポートしておく必要がある。平均と分散を計算する関数はそれぞれ meanvar である。行列の平均や分散を計算する場合は、計算する方向を指定する必要がある。

import Statistics
using Statistics


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

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

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

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

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