背景
JuliaLangはすごいと聞くけど、配列に入力さえ出来ない、というあなた。あまりに基本的すぎて検索しても出てこない。
共に頑張ろう。
一次元配列
空の配列に追加する
空の配列に追加しようとして
julia> a = Array; push!(a,3)
ERROR: MethodError: `push!` has no method matching push!(::Type{Array{T,N}}, ::Int64)
となり、? みたいなことになる。正解は、
julia> a = Any[]; push!(a,3)
1-element Array{Any,1}:
3
ここで、
Any[]
は何でも配列を意味する。Anyは省略してもよい(Version4以降?)。整数の配列なら、
Int[]
でいい。
配列の未登録のインデクス番号に値を代入する
配列のインデクスは1始まり(1-origin)である。それに気をつけて空の配列に
push!
を使わずに代入できるか。
julia> a = Int[]; a[1]=3
ERROR: BoundsError: attempt to access 0-element Array{Int64,1}
at index [1]
in setindex! at /usr/local/Cellar/julia/0.4.1/lib/julia/sys.dylib
できない。rubyとかだと出来るが、できない。
その場合は始めから辞書を使う。
julia> a = Dict{Int,Int}(); a[1]=3
3
多次元配列
二次元配列
単なる配列は
Any[]
でいいから特に気にしなくていいのだが、配列の中の型を指定したい場合がある。例えば、
julia> a = [[1 2],[3 4]]
2x2 Array{Int64,2}:
1 2
3 4
みたいな形。しかし、いざ使ってみると、
julia> a = Array{Int,2}(); push!(a,[1 2])
ERROR: MethodError: `push!` has no method matching push!(::Array{Int64,2}, ::Array{Int64,2})
型は一致しているようだが、出来ないのである。おそらく
push!
は1次元配列にしか使えない。
そこで、配列の配列を使い
julia> a = Array{Array{Int,1},1}(); push!(a,[1,2]); push!(a,[3,4])
2-element Array{Array{Int64,1},1}:
[1,2]
[3,4]
julia> a[1]
2-element Array{Int64,1}:
1
2
julia> a[1][2]
2
とするか、二次元なら、
julia> a = Array{Array{Int,2},1}(); push!(a,[1 2]); push!(a,[3 4])
2-element Array{Array{Int64,2},1}:
1x2 Array{Int64,2}:
1 2
1x2 Array{Int64,2}:
3 4
julia> a[1]
1x2 Array{Int64,2}:
1 2
julia> a[1][2]
2
とする。
julia> a = Array{Tuple{Int,Int},1}(); push!(a,(1,2))
1-element Array{Tuple{Int64,Int64},1}:
(1,2)
タプルを使う方法
行列計算をしないのであれば、タプルを使う方法のほうが楽かもしれない。
julia> a = Array{Tuple{Int,Int},1}(); push!(a,(1,2))
1-element Array{Tuple{Int64,Int64},1}:
(1,2)
julia> b,c = a[1]
(1,2)
jjulia> b
1
jjulia> c
2
まだわからないこと
ところで、次のようにできるが、
julia> a= [[1 2]]; a = [a, [3 4]]; a
2x2 Array{Int64,2}:
1 2
3 4
次のようには出来ないのはなぜか、は調査中である。
julia> a= Array{Int,2}(); a=[a,[1 2]]
ERROR: ArgumentError: number of columns of each array must match (got (0,2))