Julialangでの多次元配列使用のメモ: 配列の演算
基本の操作
添字による要素のアクセス
julia> a = [x*10+a for x=0:2, a=0:5] 3x6 Array{Int64,2}: 0 1 2 3 4 5 10 11 12 13 14 15 20 21 22 23 24 25 julia> a[2,4] 13 julia> a[1:3,4] 3-element Array{Int64,1}: 3 13 23 julia> a[2,2:4] 1x3 Array{Int64,2}: 11 12 13 julia> a[2:4,4] ERROR: BoundsError() in checkbounds at abstractarray.jl:65 in getindex at multidimensional.jl:49 julia> a[2,:] 1x6 Array{Int64,2}: 10 11 12 13 14 15 julia> a[2,3:end] 1x4 Array{Int64,2}: 12 13 14 15 julia> a[2,[true,false,false,false,true,false]] 1x2 Array{Int64,2}: 10 14
最後のBoolの配列による取り出しは、find()
で変換したインデックスの配列を使っている。
julia> find([true,false,false,false,true,false])
2-element Array{Int64,1}:
1
5
要素ごとの演算
- Matlabのように、
.+
,.*
などが使える。
julia> a = [x+a for x=0:2, a=0:5] 3x6 Array{Int64,2}: 0 1 2 3 4 5 1 2 3 4 5 6 2 3 4 5 6 7 julia> a .% 2 3x6 Array{Int64,2}: 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1
- 1変数のスカラー関数に行列を与えると自動で各要素への適用になる。
julia> f(x)=2x; f(a) 3x6 Array{Int64,2}: 0 2 4 6 8 10 2 4 6 8 10 12 4 6 8 10 12 14 julia> g(x,y)=2x+y; g(a) ERROR: `g` has no method matching g(::Array{Int64,2})
- 2変数以上の関数はbroadcast(f,A, B, ...)という関数が使える。
julia> a = [x*10+a for x=0:2, a=0:5] 3x6 Array{Int64,2}: 0 1 2 3 4 5 10 11 12 13 14 15 20 21 22 23 24 25 julia> b = [(x+y) % 2 for x=0:2,y=0:5] 3x6 Array{Int64,2}: 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 julia> broadcast((x,y) -> y*x^(y+1), a, b) 3x6 Array{Int64,2}: 0 1 0 9 0 25 100 0 144 0 196 0 0 441 0 529 0 625
- In-placeでのbroadcast
julia> a = [x*10+a for x=0:2, a=0:5] 3x6 Array{Int64,2}: 0 1 2 3 4 5 10 11 12 13 14 15 20 21 22 23 24 25 julia> broadcast! ((x,y) -> y*x^(y+1), a, a, b) 3x6 Array{Int64,2}: 0 1 0 9 0 25 100 0 144 0 196 0 0 441 0 529 0 625 julia> a 3x6 Array{Int64,2}: 0 1 0 9 0 25 100 0 144 0 196 0 0 441 0 529 0 625