中野智文

中野智文(VOYAGE GROUP)のコンピュータなどのメモ

Julia の超入門(配列編)

2015-11-26 10:45:27 | JuliaLang

背景

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))

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。