めもらんだむ

個人的な備忘録。Julia言語やPythonに関することが中心になると思われます。

Julia言語のリストやベクトルをカッコなしでファイルに出力したい

何も考えずに

example = [1, 2, 3]
out = open("hoge.out", "w")
println(out, example)

とやると、カッコ付きでファイルに出力される。入力ファイルとして使うときには邪魔くさいので、カッコを除いて出力させたい。
同じことをやりたい人がJuliaの掲示板で質問していて、その回答は以下のとおり。
discourse.julialang.org

joinを使う方がタイプ数が少なくて楽か。なお、どのやり方が早いかは調べていない。

Julia言語でコマンドライン引数を使う

コマンドライン引数を使うとは

julia hoge.jl arg1 arg2

という具合に、コマンドラインから(ココデハhoge.jlという)Juliaのコードを走らせるときに、ココデハarg1とarg2という引数を与えた上で走らせることを言う。

上記のようにすると、与えた引数はARGSというリストに格納される。与えた引数が実数や整数であっても全て文字型としてリストに格納される。

参考文献:
qiita.com

GMT.jlが動かなくてもJulia言語からGMTを使う

GMT (Generic Mapping Tools) では、GMT.jlというJuliaからGMTを呼ぶためのパッケージが用意されていますが、私の環境ではエラーが出てインストールに失敗しました。 そこで、便法としてPyCall.jlをインストールして、PyGMT経由でGMTを使うようにしています。 コンター図を1枚描くぐらいならば、これでも動作しているようです。

おまけ

GMT.jlがうまく動かない話はJulia Discourseだかで出ていて(スレッドが見つけられませんが……)、Julia本家から出されているインストールパッケージを使ってJuliaをインストールして解決したという報告がされており、環境依存性があることはわかりました。 確かに、私のところは(開発者が想定しているとは思えない)ヘンテコな環境で、Anacondaで作成した仮想環境上にconda-forgeにあるJuliaをインストールして使っています。

改めてGMT.jlパッケージを入れ直すと、今度はうまくインストールできました。 パッケージのアップデートをかけた後なので、何かのパッケージが古いためにインストールがうまくいかなかったのかもしれません。

Julia言語のパッケージ管理

パッケージを追加するところは色々情報があるが、パッケージのメンテナンスに必要な情報があまりないようなのでメモ。

※もう少しだけ調べると、コロナ社から出ている『1から始めるJuliaプログラミング』の2.11にちゃんと出ていた……。

まずはREPLでパッケージ管理モードに入る。

アップデートがあるかを確認する

単に

status

とすると現在入っているパッケージのリストが表示され、アップデートできるパッケージの行頭には^という印が付く。

パッケージのアップデート

単に

update

とすると、アップデート可能なパッケージが全てアップデートされる。 特定のパッケージをアップデートするときは、パッケージを新規追加するときと同様、そのパッケージの名前を引数としてupdateコマンドに渡す。

<注意>アップデートを反映させるためには、現在立ち上げているREPLを一旦終了させて再立ち上げすることが必要。

Julia言語のループが独立した変数のscopeを有していることへの対応

Julia言語のループでは変数のscopeが独立していることは合理的な面もあるが、ループ内で生成した変数をループ外で参照したいときには不便を感じる。ループ内で生成した変数をループ外で参照したいときには、ループに入る前にその変数を定義してループ内で加工する形をとるしかない。どのように定義するとプログラムの変更が少なくて済むかとか、可読性(人それぞれクセがあるので、この点は主観が大きいかもしれない)を考えると、Nothingタイプとするのがよさそうな気がしている。例えば、hogeという変数をループ内で加工した後にまた参照したいときには

hoge = Nothing

とループ外で定義しておいてから、ループ内の作業に持ち込む。これならば、変数hogeの属性が変わっても、いちいち変更しなくてもよい。

2023年1月6日追記

Julia言語のループ内で定義された変数のscopeはループのくり返しレベルで異なるということが発覚した。

"for" creates a new scope for each iteration

なんだそうだ。

discourse.julialang.org

hoge = Nothing

の代わりに、ループの外で

local hoge

と書いてもよい。
というか、こちらの方がむしろ目的とその対処がきちんと対応しているので好ましいと思われる。

Julia言語:複合型(struct)の編集でハマったこと

REPL上でstructを編集し、再度include...としてJuliaのコードを走らせると

ERROR: LoadError: invalid redefinition of constant StructFltPrm

と出て、コードが走らなくなる。structをいじると(コンパイルを?)一からやり直す必要があるようで、一旦REPLを終えて再度立ち上げてからinclude...とする必要がある。

Juliaの中身の理解が浅いのでこれでよい理由がきちんと理解できておらず、おまじないレベルの対応だが、とにかくこうすれば動くので今のところは良しとしましょうか。理解が進めば「そんなん、当たり前やん」と思えるようになるのだろう。

任意の数値をとる係数を伴う被積分関数をQuadGKで数値積分する:anonymous functionの利用

1変数の数値積分を行うQuadGKを使った数値積分の紹介記事は色々見つかるが、被積分関数中の係数が定数のものばかりで、被積分関数の係数を引数として与える例がうまいこと見つけられなかったが、anonymous functionを使えばよいらしいことに気付く。

今、被積分関数をf、積分区間をx1からx2(x1 < x2)として、QuadGKを呼ぶとき
quadgk(f, x1, x2)
というのが被積分関数中の係数が定数のとき。被積分関数中の係数a, bが変数、xが積分変数として
f(x, a, b)
として、fの値を得る関数を積分したいときは
quadgk(x -> f(x,a,b), x1, x2)
とすればよい。

QuadGKに限らず、他の関数も同様にして呼べると思われるが、試してはいない。

Juliaとanonymous functionで検索すると、(ようやく)よい説明に行き当たった。
the most important use for anonymous functions is passing functions as arguments to other functions, in particular when the function needs additional data to be evaluated.
とある。
m3g.github.io

anonymous functionというキーワードを知らないと、辿り着けそうにないなぁ。