#Julia言語

[f(x) for x in X if cond(x)] では、実際に条件を満たすすべてのxについてf(x)を計算して、Array(配列)ができ、その分だけのメモリ割当が生じる。

(f(x) for x in X if cond(x)) は単に条件を満たすf(x)達の生成の仕方を記述したオブジェクトになり、メモリをほとんど消費しない。
#Julia言語

sum([f(x) for x in X if cond(x)]) では [f(x) for x in X if cond(x)] の分の配列が作られて、その分だけのメモリ割当が生じる。

一方、sum(f(x) for x in X if cond(x)) ではそのような無駄なメモリ割当は発生せず、条件を満たす各々のxについてf(x)が計算され、即足し上げられる。
#Julia言語 これらの違いはループの内側でそのような和を計算するときにはパフォーマンスに決定的な影響を与える。

条件無しに単に x∈X について和を計算したい場合には

sum(f, X)

とも書ける。誤差の観点からはこちらの方が好ましい(Float32で計算する場合は特にそうである)。
#Julia言語 Σ_{n=1}^N f(n) の計算で((f(1) + f(2)) + f(3)) + f(4)のようにリニアに足して行くと、f(1)+…+f(k)と比較してf(k+1)が小さいときに(f(1)+…+f(k))+f(k+1)の計算で大きな桁落ちが発生する。

「塵を集めて大きくしてから足すこと」を帰納的に実行しないと無用に誤差が大きくなる。
#Julia言語 足し上げ方はトーナメント戦の組み方と一対一に対応している。

リニアに足し上げることは添付画像のAに対応している。多くに場合にこれで用が足りるが、稀にまずい場合が出て来る。

別の極端な場合がBである。これなら「塵を集めて大きくしてから足し上げること」が起こり易い。
#数楽 n人のトーナメント戦の組み方の形の個数にはCatalan数という名前がついている。

そういう名前を知っていることは、検索時には必要だが、数学を理解していることとは無関係である。

しかし、トーナメント戦の組み方が一見関係無さそうな問題によく出て来ることは数学的に重要である。
#Julia言語 リニアな足し上げは速いのでパフォーマンスを落とさないようにAとBの中間の方式を採用するのが合理的。
#Julia言語 sumひとつだけでも多くのことを学ぶことができる。

多分、大学の学部向けの半年分の講義を sum 関連の話だけで立派に終わらせることも可能。
#Julia言語 で sum は

github.com/JuliaLang/juli…

で実装されている。

めちゃくちゃ地道に細かいことをやっている。

我々一般ユーザーには普段見えない部分を眺めると多くの発見がある。

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with 黒木玄 Gen Kuroki

黒木玄 Gen Kuroki Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @genkuroki

22 Mar
#Julia言語 では任意の型のオブジェクトfにf(x), f(x,y), …のように使える函数の機能を追加できます。

だから、函数を引数とする函数φを function φ(f::Function) ~ end と定義すると、見た目的に動いて欲しいコードが動かなくなるリスクが増える。

function φ(f) ~ end と書くべき。
#Julia言語 函数を中身に持つstructを

struct Foo{T<:Function}
f::T
end

と作っても、見た目的に動いて欲しいコードが動かなくなる場合が増えます。

struct Foo{T}
f::T
end

なら大丈夫。

Juliaの型について理解が不十分な状態で型名をコード中に書くと大抵失敗する。
#Julia言語 Juliaでは、型が先にあってその中に値が含まれていると考えるのではなく、値が先にあって、その値の具体的な型を次に考え、その後にその具体的な型を含むもっと広い抽象型を考える、という順番に考えないといけない感じ。

Juliaでのコンパイルは入力の値の具体型に合わせて実行される。
Read 9 tweets
22 Mar
#Julia言語

Juliaでは入力の値の具体的な型を見てからそれに合わせてネイティブコードにコンパイルする仕組みで、支払わなければいけないトレードオフは当然発生する。

しかし、入力の値の型ごとに最適化されたネイティブコードに自動的にコンパイルされる仕組みは多くの場合に便利です。
#Julia言語

Juliaで函数f(x)のコードを書くときには、単純に

f:A→B

のようになるとは考えずに

xの値の具体的な型が決まると、xの値の具体的な型が伝搬して行って、f(x)の値の具体的な型も決まる

となるようにコードを書くことを考えます。

確認には @ code_warntype などを使う。
Read 5 tweets
22 Mar
#Julia言語 普通にJuliaの(野良または公式)パッケージ化した方がよいかも。(Juliaなら野良パッケージ作成は相当に簡単)

ただしその場合にはパッケージ名に"Julia"も文字列は入れない方がよい。
pkgdocs.julialang.org/v1/creating-pa…

野良及び公式パッケージ作成の基本→ github.com/invenia/PkgTem…
#Julia言語 PkgTemplates.jlについて巷に出回っている解説で注意するべきことは、GitHubでmasterではなくmainを使うようになったこと。

masterと書いてあったらmainと解釈しなければいけない。注意しないと、mainブランチと別にmasterブランチを作ることになってしまう。

(((私は実際にやらかした)))
#Julia言語 自分のパソコン内にしかないパッケージをJuliaで作るのは非常に簡単。適切なディレクトリで

pkg> generate MyFoo
pkg> dev MyFoo
julia> using Revise
julia> using MyFoo
julia> MyFoo.greet()
MyFoo/src/MyFoo.jl内のgreet()の内容を変更
自動的にREPLに反映
julia> MyFoo.greet()
Read 5 tweets
21 Mar
#Julia言語 10行では無理なやつ

正方形上の自由境界条件の波動方程式の離散化をDifferentialEquations.jlで数値的に解いて動画を作ってみた↓
nbviewer.jupyter.org/gist/genkuroki…

これを作るために必要な行数は40行程度でした。
#Julia言語 約1万個の質点がバネで繋がっている状況を記述する常微分方程式 prob を DifferentialEquations.jl に sol = solve(prob) の形式で数値的に解かせています。自分でソルバを書かなくて良いとかなり楽です。

nbviewer.jupyter.org/gist/genkuroki… Image
#Julia言語 正方形ではなく、正五角形上の自由境界条件のもとでの波動方程式の数値解。

これもDifferentialEquations.jlを使っています。
コードの効率はそうよくないのですが、シンプル。 ImageImage
Read 6 tweets
20 Mar
私が大学1年で受けたコンピュータの教育はFORTRAN 77で、最初の講義でホーナー法の解説があった。

FORTRAN 77でも教えられることばかりだとつまらないので、数値計算におけるコードの自動生成の重要性なんかも教育に組み入れると面白いと思う。

#Julia言語 なら完全なマクロがある。
#Julia言語 Juliaでも使われているFloat64でのsin(x), |x|≤π/4をよく近似する13次多項式と同等の13次多項式をJuliaを使って自力で求めてみる話が以下のリンク先スレッドにあります。

Float64に特化した係数の計算は繊細な注意が必要な問題だった。

興味がある人は自分でやってみるとよいと思う。
#Julia言語 私が求めた13次多項式の係数と伝統的に使われている13次多項式の係数は微小に違うのですが、相対誤差をほぼ同じです。グラフ的には区別ができない!

謎のレシピを謎のまま残さずに自力で求められるようにしておくことが、数学がらみの事柄では基本になります。

gist.github.com/genkuroki/362b…
Read 5 tweets
20 Mar
MATLABも素晴らしい製品だと思いますが、 Pythonに、特にmatplotlibに慣れているなら、#Julia言語 の方を最初に試した方が多分得だと思います。

Juliaでもmatplotlibを使えます。プロットの仕方の習得コストはものすごく高い。
英語でいいならネット上に結構沢山あるような気がしますが、学部生向けだと確かにつらいかも。

検索するときにはGoogleの設定を「地域:アメリカ合衆国」にしろと言っておく必要もある。

v1.0.0が出た2018年8月より前に書かれた #Julia言語 のコードは現在のJuliaでは動かないという情報も結構重要。
#Julia言語

MITでの数値計算コースのJulia tutorial

Juliaのインストールの仕方
github.com/mitmath/julia-…

Jupyter notebook
github.com/mitmath/julia-…

これをマスターすればすぐに計算に入れると思う。
Read 6 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!

Follow Us on Twitter!