8
4

More than 3 years have passed since last update.

Julia便利記法・機能備忘録(関数編)

Last updated at Posted at 2020-11-15

この記事の目的

自分用にjuliaの便利な記法や機能をまとめておきたかったので記事にして公開することにしました。
juliaはpython並みの書きやすさをうたっているのでかなり簡潔にコードを書くことができます。せっかくならできるだけすっきりしたコードを書けるようになりたいですよね。


ここからは全部REPL上で行います。前に出てきた変数は再定義しない限りそのまま使います。

簡単な関数定義

julia> function f(x)
           2x + 3x^2
       end
f (generic function with 1 method)

julia> f(x) = 2x + 3x^2
f (generic function with 1 method)
#上二つは等価で、頭にfunctionなんて書かなくてもよいです。
#実際の数式に近い記法で定義できます。
#また、数字×文字の場合は*を省略できます。

julia> f = x -> (2x + 3x^2)
#49 (generic function with 1 method)
#このように書いても等価です。

無名関数

julia> x -> x^2
#3 (generic function with 1 method)

#mapとか使うときに簡単な関数をこう書くとよさそうです。

関数のベクトル化

julia> xs = [1 2 3 4]
1×4 Array{Int64,2}:
 1  2  3  4

julia> f(xs)
ERROR: DimensionMismatch("matrix A has dimensions (1,4), matrix B has dimensions (1,4)")

julia> f.(xs)
1×4 Array{Int64,2}:
 5  16  33  56
#.を入れることで自作の関数も配列に対して計算してくれます。

julia> map(f, xs)
1×4 Array{Int64,2}:
 5  16  33  56
#一応mapでも同じことができますが、上記のほうが簡潔です。

julia> y =  @. sin(cos(xs))
1×4 Array{Float64,2}:
 0.514395  -0.404239  -0.836022  -0.608083
#マクロ@.を使うとその行すべての関数を.があるものとして扱えます。

関数合成

julia> g(x) = -x
g (generic function with 1 method)

julia> 2 |> g |> f
8
#f(g(2))をこのように書けます。括弧がいっぱいあると嫌なのでこの方がきれいですね。
#パイプライン演算子とかいうらしいです。

julia> (f∘g)(2)
8
#この表記でもいいです。∘は\circ + tabで出せます。
#g|>fと f∘gは等価ではありません。
#前者は最初の引数から順番に評価している(必ずgの引数を書く必要がある)だけに対し、
#後者は先に関数の合成をしてから引数を受け取ります。
#合成関数を1つのオブジェクトとして扱いたい場合は∘を利用します。

julia> xs .|> g .|> f
1×4 Array{Int64,2}:
 1  8  21  40
#この表記の時も.でベクトル化できます。

畳み込み

julia> foldl( *, [1,2,3,4], init=1)
24

julia> foldl((x,y)->x+2y, 1:4)
19
julia> foldl((x,y)->x+2y, 1:4, init=0)
20

#juliaは多重ディスパッチが使えるので初期値を利用したい場合はinit=と書けば別の関数を勝手に呼び出してくれます。
#書かない場合は第一要素が初期値として使われます。

微分

#f(x) = 2x + 3x^2
#g(x) = -x
julia> using ForwardDiff
julia> df(x)=ForwardDiff.derivative(f,x)
df (generic function with 1 method)

julia> df(2)
14
#一変数関数の微分
#省略しますが、gradientやhesse行列も計算できます。
#pythonのsympyと違って普通の関数表記で利用できるのがいいですね。


julia> d_dx(f) = x -> ForwardDiff.derivative(f,x)
d_dx (generic function with 2 methods)

julia> d_dx(f)(2)
14
#関数d_dxを微分演算子のように思えるのでこの方がいいかもしれません。

julia>  d_dx(f ∘g)(1)
4
#(f ∘g)(x) = 3x^2-2x
#(f ∘g)'(x) = 6x-2
#このように合成関数の微分を簡単に実現できます。

便利な記法・面白い機能を見つけ次第追記していきます。
juliaは本当に数学に近い表記ができるので使いやすいですね。

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4