Open11

Juliaの使い方を勉強していく(演算子、マクロなどの仕様)

yuuyuu

juliaで使われるマクロに関して

yuuyuu

スプラット演算子ってなにか?

...

yuuyuu
pp = [1, 2, 3]
f(pp[1], pp[2], pp[3])
f(pp...)

のように、引数を自動で拡張することができる

yuuyuu

タプルとは配列に似た型であるが、配列とは違い値を変更することができない固定長の要素の集まり

具体的な使い方

  1. 複数の引数を持つ関数にたいしてパラメータを与える
# 配列
a = [1, 2, 3]
a
#> 3-element Vector{Int64}:
#>  1
#>  2
#>  3
a[1] = 10
a
#> 3-element Vector{Int64}:
#>  10
#>  2
#>  3

# タプル
b = (1, 2, 3)
b
#> (1, 2, 3)

b[1] = 10
#> MethodError: no method matching setindex!(::Tuple{Int64, Int64, Int64}, ::Int64, ::Int64)

引用) Juliaで作って学ぶベイズ統計学 | 書籍情報 | 株式会社 講談社サイエンティフィク

yuuyuu

複数の引数を持つ関数にたいしてパラメータを与えるときにスプラット演算子...を用いて与える

p = (1, 2, 3)
f(a, b, c) = a + b + c
f(1, 2, 3)
#> 6
f(p...)
#> 6
f(p[1], p[2], p[3])
#> 6
yuuyuu

配列に対しても...は可能

pp = [1, 2, 3]
f(pp[1], pp[2], pp[3])
f(pp...)
#> 6
yuuyuu

Juliaのパイプ演算子に関して

  • Base.Pipe
  • Pipe.jl
  • Chain.jl
    が現在確認中。それぞれの違いは?
yuuyuu

Juliaで乱数を出力する方法

文字列乱数

using Distributions

# - 文字列乱数
letters = ["a", "b", "c"]
probs = [0.1, 0.2, 0.7]

letters_dist = Categorical(probs)
println(letters[rand(letters_dist)])
#> a

# - 複数の文字列乱数
println(letters[rand(letters_dist, 10)])
#> ["c", "b", "c", "b", "c", "c", "c", "b", "b", "b"]
yuuyuu

整数乱数

rand(1:5, 10)
#> 10-element Vector{Int64}:
#>  2
#>  1
#> ....
#>  4

一様乱数

rand(Uniform(1,10), 10)
#> 10-element Vector{Float64}:
#>  1.779145123574671
#>  5.162092601718651
#>  3.143458858775074
#>  6.268164774415135

OR

uni_dist = Uniform(1, 10)
rand(uni_dist, 10)

二項分布

rand(Binomial(1, 1/10), 10)
#> 10-element Vector{Int64}:
#>  0
#> ...
#>  0
#>  1
#>  0
#> ...

正規分布

# nrm_dist = Normal(); rand(nrm_dist, 10)
rand(Normal(), 10)
yuuyuu

forループに関して

enumurate()関数を使った配列に対するforループ

  • enumerate関数は要素のインデックス番号と要素を同時に取り出すことが出来る関数
  • pythonで使われている
αs = [[0.1, 0.1, 0.1],
      [0.5, 0.5, 0.5],
      [1.0, 2.0, 5.0]
     ]
for i in enumerate(αs)
    println(i)
end

#> (1, [0.1, 0.1, 0.1])
#> (2, [0.5, 0.5, 0.5])
#> (3, [1.0, 2.0, 5.0])
yuuyuu

enumerate()を使ったfor loop

x_list = [-1.0, 0.0, 1.5]

for (i, j) in enumerate(x_list)
    println("i:$i, j:$j")
end

#> i:1, j:-1.0
#> i:2, j:0.0
#> i:3, j:1.5