りんごがでている

何か役に立つことを書きます

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

関数としては以下の図のような感じです。

f:id:bicycle1885:20151207011650p:plain

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