Julia 小技集
完全に自分用
便利な小技をメモしていく
随時更新。
現在の環境
Julia Version 1.1.0 Commit 80516ca202 (2019-01-21 21:24 UTC) Platform Info: OS: Linux (x86_64-pc-linux-gnu) CPU: AMD Ryzen 7 1700 Eight-Core Processor WORD_SIZE: 64 LIBM: libopenlibm LLVM: libLLVM-6.0.1 (ORCJIT, znver1) Environment: JULIA_DEPOT_PATH = /opt/julia JULIA_PKGDIR = /opt/julia JULIA_VERSION = 1.1.0
- 型を一段階アップグレードする関数
例:Int64 -> Int128
wilden(x)
- Array{Array{hoge, 1}, 1}を2次元配列に直したい
vcat(a...)
- 配列の要素ごとに関数を適用
map([1,2,3]) do x 何らかの処理 end
xに配列の要素を代入してdo-end間の処理をしてくれる。
- 多次元配列の成分ごとに関数を適用
mapslices(関数, 対象配列,dims=次元の指定)
次元の指定では[1,2]のように複数の次元を指定できる。
Meta programming
動的に構造体を定義
例)
macro make_struct(struct_name, schema...) fields=[:($(entry.args[1])::$(entry.args[2])) for entry in schema] esc(quote mutable struct $struct_name $(fields...) end end) end println(@macroexpand @make_struct STRUCT_NAME (x,Int32) (y, Float32)) @make_struct STRUCT_NAME (x, Int32) (y, Float32)
その他
デバッグにはRevise.jl(https://t.co/4v48ihKEOR)が便利ですよ。REPLを起動したままファイルを更新すれば自動で変更が反映され,再コンパイルも最小限で済みます。
— (「・ω・)「ガオー (@bicycle1885) 2018年10月12日
マルチGPU
忘れないうちに昨日やったことを書いた(令和初の記事)
— Astellon (@astellon_music) 2019年4月30日
JuliaでもMulti-GPUsしたい - part of something https://t.co/rHKiO5TUzi @astellon_musicさんから
- 関数のベクトル、多次元配列への拡張
function f(x) xに対する処理 end function g(x::Vector{T}) where {T<:AbstractFloat} xに対する処理 end # 行列の成分ごとに上記の関数gを適用 function g(x::Matrix{T}) where {T<:AbstractFloat} mapslices(g, x, dims=次元の指定) end
構造に対しては明示的に、数値型に関してはパラメトリック型で定義すると使いやすい(個人の感想)
f(x)を要素ごとに適用したいならf.(x)とすれば良い。
@viewなどで参照を渡す場合は具体型ではなく抽象型で定義したほうが良い(SubArrayがわたされるので)