or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing
xxxxxxxxxx
細かすぎて伝わらないかもしれないJuliaのTips
2022/12/18 JuliaTokai #13
antimon2(後藤 俊介)
Note:
Julia の基本Tips?
お品書き
お前誰よ?
自己紹介
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →Note:
今日は(も?)大っぴらに Julia の話ができるっ
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →https://www.kurusugawa.jp
Note:
普段は Python で仕事してますっ
https://ngk2022s.connpass.com/event/265837/
Note:
MGK2023S のスタッフやってますっ
簡単な
Julia の紹介
Note:
Julia の紹介っ
Note:
こんなロゴですっ
Julia とは?(1)
Note:
ググるときはなるべく julialang で!
Julia とは?(2)
引用元:http://www.slideshare.net/Nikoriks/julia-28059489/8
Julia とは?(3)
(Why We Created Julia から抜粋・私訳)
Note:
いろんな言語の「いいとこどり」言語!ってことでっ
要するに
Note:
機械学習とかにも持って来いっ!
主な機能
Note:
っ
文法・関数
Note:
以降、ほぼ過去スライドからのコピペ。すっ飛ばして先へ進んで戴いてもOKっ
基本的な演算
Note:
整数同士の除算は実数になりますっ
整数除算演算子
÷
が別に存在します(Python の//
相当)っまた冪乗も(
**
ではなく)^
ですっ⊻
は\xor
+Tab または\veebar
+Tab で変換できますっちなみに先ほどの
÷
も\div
+Tabで(基本的に \({\rm \TeX}\) の書式)っ配列
Note:
1-origin であることに注意すればあとは普通の配列っ
あと
a:b
は範囲(Range
)の記法。両端を含む(Ruby のa..b
と同じ)っ配列の内包表記 (1)
Note:
内包表記の記法は Python に類似っ
かつ、
for
にカンマ区切りで複数のイテレータを渡すことで2次元以上の配列も作成可能っ配列の内包表記 (2)
Note:
Python と同様に
if
で条件を指定することも可能っあと Python と同様、
[○ for ○=○]
を(○ for ○=○)
と書くと配列ではなくてGenerator
が返りますっ多次元配列(v1.7以降)
Note:
;
の数で次元方向の区切ができるっこれだけでも v1.7 を使うべきと言える仕様拡張っ!
ベクトル
Note:
Julia では実は1次元配列がベクトルの扱いっ
⋅
は\cdot
+Tab、×
は\times
+Tab(これらを利用するにはusing LinearAlgebra
必要)っあとこれらや先ほどの
÷
や⊻
などのように、ASCIIの範囲を超えたUnicode文字の演算子(そのほとんどが \(\TeX\) 由来)が Julia にはたくさんあります(他には例えば比較演算子の≤
≥
や、集合の要素∈
や包含関係⊆
などなど)行列
Note:
Julia では2次元配列が行列の扱いっ
v1.6 から転置を表す表記として
○'ᵀ
と書けるようになりましたっ'\^T
+ TAB で入力できますっ行列の演算
Note:
行列は
*
で通常の行列積になりますっこれ便利っブロードキャスト
Note:
関数名と
(
の間に.
を置くと、普通の関数を配列に拡張してくれる(ブロードキャスト)っ.^
のように演算子の前に.
を書いても同様(先ほど出た.+
.*
もブロードキャスト)っ関数定義
Note:
数学のように直感的な記述で関数を定義可能っ
2x
は2*x
の省略形、曖昧さがなければリテラルと他の識別子が続く場合などに勝手に乗算と解釈してくれるっまたユーザ定義関数も
.
をつけて自動的にブロードキャスト対応っ有理数・複素数
Note:
有理数・複素数を標準サポート。
//
は有理数除算(結果は有理数)im
は虚数単位。どちらも四則演算も普通に書けますっ
Tips集 (?)
Note:
本題!
シチュエーション1:
findXXX()
系関数?findXXX()
系の関数って、こういうとき使えるの?⇒
Note:
…
解決法1:
for
文で回せばOKNote:
…
Note:
…
Note:
…
解決法2:無理矢理
findXXX()
を利用する形に落とし込むNote:
…
Note:
…
Note:
…
ベンチマーク
Note:
…
Note:
…
Note:
…
Point1
findXXX()
は「条件に合致するもののインデックス(の範囲)を返す関数(存在しなければnothing
)」という共通仕様findmax()
/findmin()
for i in eachindex(a)
またはfor i in keys(a)
for i in 1:length(a)
は危険!Note:
※ Julia の
findXXX()
系の関数は「条件に合致するもののインデックス(の範囲)を返す関数(存在しなければnothing
)」という共通仕様がある(例外:findmax()
/findmin()
)ので、findNrepeats()
もそれに合わせた仕様にしてあります。※ Julia のインデックスは(標準の1次元配列なら)1-originだけど、全てのコレクションのインデックスがそうとは限らない(設定次第)ので
for i in 1:length(a)
のように書くのは危険!Point2
findXXX()
系の関数は正直使いづらいし、必ずしも高パフォーマンスとは限らない。for
ループ速い!allequal()
て関数知ってた?Note:
※ あと「コレクションの要素が全て同じかどうか」を判定するズバリ
allequal()
て関数が標準であります。便利♪知ってました?なお「コレクションの要素が全て異なるかどうか」を判定する
allunique()
てのもあります。参考:文字列なら 正規表現+
findfirst()
でOK!Note:
…
Note:
…
Note:
…
参考の参考:文字列なら正規表現+
findXXX()
でOK(キャッシュしないバージョン)Note:
…
Note:
…
Note:
…
ベンチマーク
Note:
…
Note:
…
Note:
…
Point3
findXXX()
は文字列検索の場合パターン(正規表現、文字の範囲等)も利用OK!@generated
(生成関数)こういうとき便利♪Note:
※
findXXX
は文字列検索の場合第1引数は関数だけではなくパターン(正規表現、文字の範囲等)もOK!※ ただし毎回正規表現を生成するのは意外とコスト高い(=遅い)ので何らかの方法でキャッシュする必要あり(正規表現リテラルが使用できるなら使用するなど)
※ てかこのサンプルを作ることで
@generated
(生成関数)の使い途を1つ見つけてしまった♪これ基本!補足:
findXXX()
(第1引数に関数を受け取る使い方)Note:
→ 配列や文字列だけじゃなくて、辞書(
Dict
)や名前付きタプル(NamedTuple
)にも同じI/Fで利用できるから(それらの場合キー(の列)が返る)。Note:
…
シチュエーション2: Y/A
findXXX()
系関数findXXX()
系関数の理念や使い途は分かった。分かったけれどやっぱ使いにくい!nothing
)」っていう関数はないの?⇒
Note:
…
解決法1:
Iterators.dropwhile()
とBase.first()
を組み合わせればOKNote:
…
Note:
…
Note:
…
Note:
…
解決法2:パフォーマンス気にしてみる
Note:
…
Note:
…
Note:
…
Note:
…
ベンチマーク
Note:
…
Note:
…
Note:
…
Point1
first(Iterators.dropwhile(!pred, itr))
!《関数》
はx -> !(《関数》(x))
相当first(《空のイテレータ》)
は例外が発生してしまうので適切に対処Note:
※ 基本的な発想は
first(Iterators.dropwhile(!pred, itr))
※
!pred
というのは、pred()
関数の結果(Bool
値 という前提)を否定、つまりx->!(pred(x))
相当※
first(《空のイテレータ》)
は例外が発生してしまうので適切な対処が必要Point2
iterate(itr)
:(《要素》, 《状態オブジェクト》)
nothing
Note:
※ Julia のイテレーションの仕組み(
iterate()
関数の使い方・戻り値)を知っていれば、first()
関数相当のことを簡単に実現できてしかも例外処理不要!(Julia の例外処理は意外と重い!)※ (簡単におさらい)
iterate(itr)
は、最初の要素があるときは(《要素》, 《状態オブジェクト》)
、なければnothing
シチュエーション3: 文字列の折り返し
⇒
Note:
解決:行末に
\
を入れることで折り返しできる(ようになった)よ!(≥v1.7)Note:
…
Note:
…
Note:
…
Note:
※リテラルとして同一になる(今回の場合)ので
===
で比較してもtrue
になる!Point
Note:
Julia v1.6.x 以前を捨てて良いコードならば。
参考:v1.6.x も対象のコードなら…
Note:
※ なお最適化の関係でこれくらいの長さの文字列ならたぶん
jgm0 === jgm_oldstyle
になります。。。シチュエーション4:
OrderedDict
とかSortedSet
とかDict
やSet
って順不同ですよね…OrderdDict
とかSortedSet
欲しい…⇒
Note:
Dict
やSet
って追加順やキーの序列と列挙順が順不同ですよね…OrderdDict
とかSortedSet
欲しい…ん…解決1:外部パッケージ
DataStructures
にあるからそれ使うのが素直な解決法Note:
…
Note:
…
Note:
…
Note:
…
Note:
…
解決2:
Vector
でキーの列を別管理するNote:
列挙時にだけ追加順/ソート順が欲しい場合
Note:
…
Note:
…
Note:
…
Point1
DataStructures.jl
便利♪OrderedDict
/SortedSet
の他にSortedDict
/OrderedSet
ももちろんあるNote:
…
Point2
Vector
で別管理するのもお手軽で十分Note:
※ その分メモリを消費するが、列挙時にだけ追加順/ソート順が欲しいならそれで十分
※ ↑の「解決2」でもそんなに困らない(長さが膨大でなければ)
シチュエーション5: 無名関数の多重定義
fn = x -> x*x
⇒fn(x, y)
はメソッドエラー(まぁ当然)fn(x) = x*x
→fn(x, y) = ~
と多重定義できる⇒
Note:
fn = x -> x*x
みたいにして関数を定義すると、fn(x, y)
のような呼び出しは失敗しますよね。多重定義されていないから。fn(x) = x*x
という定義にすれば良い、そうすれば後でfn(x, y) = ~
と多重定義できる、それは分かります。解決:できます!
Note:
…
Note:
…
Point
Note:
※ 重要:できるけれどほぼ使い途はありません!
シチュエーション6: 文字列のインデックス
s = "123ABCあいう😁漢字"
に対して「s
の10文字目」と指定して「'😁'
」を取得したい…。⇒
Note:
s = "123ABCあいう😁漢字"
に対して「s
の10文字目」と指定して「'😁'
」を取得したい…。解決1:
nextind()
という関数が用意されています!Note:
…
Note:
…
Note:
…
参考1:他の
xxxxind()
系の関数Note:
…
参考2:
eachindex()
関数Note:
…
参考3:
split()
の場合Note:
※似たようなことはできるが以下が異なる:
Char
)ではなく文字列(SubString{String}
)になるまとめ
Note:
っ
リンク
実験Note
参考リンク
ご清聴ありがとうございます。
Note:
ご清聴ありがとうございますっ!