プログラミングの実験場

Haskell/Webアプリ/画像処理/可視化/ITによる生産性向上 など

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