元バイオ系

元バイオウェット系がデータサイエンスやらを勉強していくブログ。 基本自分用のまとめ。

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

動的に構造体を定義

discourse.julialang.org

例)

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)

その他

デバッグ

マルチGPU

  • 関数のベクトル、多次元配列への拡張
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がわたされるので)