Juliaの多分あまり知られてない関数達
Julia Advent Calendar 7日目の記事です。今週ひとりアドベントカレンダーの様相を呈してきているので誰か助けてください。
JuliaのBase
モジュールの関数はたくさんあるため、意外と知られていない関数もあると思います。
ですので、個人的によく使うなぁという関数をピックアップして紹介しようと思います。
開発
versioninfo()
Juliaのバージョンなどを環境を知るのに便利です。
バグ報告などの時はこの情報を必ず添付しましょう。
versioninfo(true)
とするともっと詳しく出てきます。
julia> versioninfo() Julia Version 0.4.1 Commit cbe1bee* (2015-11-08 10:33 UTC) Platform Info: System: Darwin (x86_64-apple-darwin14.5.0) CPU: Intel(R) Core(TM) i5-4288U CPU @ 2.60GHz WORD_SIZE: 64 BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Haswell) LAPACK: libopenblas64_ LIBM: libopenlibm LLVM: libLLVM-3.3
workspace()
REPLなどで環境をクリアにするのに使います。開発中などに一旦リセットする場合便利でしょう。
julia> x = 100 100 julia> workspace() julia> x ERROR: UndefVarError: x not defined
gc_enable()
GCの動作を管理できます。例えば、gc_enable(false)
とすれば、GCを止めることができます。
ベンチマークなどのときに便利かもしれません。
数値計算
fld(x, y)
, cld(x, y)
fld(x, y)
は x / y
して整数へ切り下げ、cld(x, y)
はx / y
して整数へ切り上げる感じです。
浮動小数点数を経由せずに計算するので高速で正確です。
clamp(x, lo, hi)
値x
をある範囲 [lo, hi]
に押し込む関数です。外れ値などを適当にあしらう(?)ときに便利です。
julia> clamp(-10, -1, 2) -1 julia> clamp(1, -1, 2) 1 julia> clamp(10, -1, 2) 2
関数としては以下の図のような感じです。
quantile(v, ps)
分位数を計算する関数です。何かの計算結果などで、ベクトルの分布を超大雑把に知るのに便利です。
julia> quantile(randn(1000), 0.5) 0.06427123889979461 julia> quantile(randn(1000), linspace(0, 1, 6)) 6-element Array{Float64,1}: -3.40151 -0.873353 -0.265595 0.215862 0.776136 3.97968
文字列
lpad(string, n, p)
と rpad(string, n, p)
文字string
を固定幅n
で出力します。lpad
は左側をp
で埋め、rpad
は右側をp
で埋めます。
ちなみにp
は省略可能で、省略すると空白文字になります。
アラインメントを取るような出力をするときに便利ですね。
julia> lpad("foo", 6) " foo" julia> lpad("foobar", 6) "foobar"
chomp(string)
文字列の最後にある改行を削除します。perlにも同名の関数がありますね。 ファイルを一行ずつ読み込んで処理するときに、改行文字を取り除くのに便利です。
for line in eachline(io) line = chomp(line) ....
その他
cat(dims, A...)
複数の配列A...
をある次元dims
で結合します。
julia> cat(1, [1,2,3], [4, 5, 6]) 6-element Array{Int64,1}: 1 2 3 4 5 6 julia> cat(2, [1,2,3], [4, 5, 6]) 3x2 Array{Int64,2}: 1 4 2 5 3 6
なお、vcat(A....)
とhcat(A...)
もあり、コレらはそれぞれcat(1, A...)
、cat(2, A...)
と同じです。
mark(s)
とreset(s)
mark(s)
でストリームs
にマークを付け、reset(s)
で前回マークをつけたところまでストリームを巻き戻す事ができます。
ファイルのパースなどで、先読みが必要な場合に便利ですね。ちなみにunmark(s)
でマークは消せます。
xdump(x)
オブジェクトx
のデータ構造をプリントします。
特に便利なのが式を扱う場合で、マクロを書くときには必須のツールになります。
例えば、import Foo.Bar: baz
の構文木がどうなってるかを知りたい場合は以下のように知れます。
julia> xdump(:(import Foo.Bar: baz)) Expr head: Symbol import args: Array(Any,(3,)) 1: Symbol Foo 2: Symbol Bar 3: Symbol baz typ: Any::DataType <: Any
now()
文字通り、「今」を返します。「いまッ!」って感じです。
julia> now() 2015-12-07T17:20:31