Week 8: グループワーク2(1回目)
今日やること
はじめに
最初に少し講義をします。
その後、チームに分かれて作業を行います。
内包表記
便利ですが慣れないとわかりにくい記法として、内包表記があります。これは、数学の集合記法に似ています。例えば、がからまでの整数の集合を考えます。 この集合の各要素を二乗した集合であるを考えたいとします。これは数式としてはセットビルダーノテーションを用いて次のように書けます。
これと同様の処理が、juliaでは次のように書けます。
S = [x^2 for x in 1:5]
この結果は次のようになります。
5-element Vector{Int64}:
1
4
9
16
25
ここでは得られるものは集合ではなくベクトルですが、数式の場合と同様の処理を実現できています。
また、この表記は多次元にも拡張できます。以下のように、i
とj
から行列を構成できます。
[2i + j for i in 1:4, j in 1:3]
4×3 Matrix{Int64}:
3 4 5
5 6 7
7 8 9
9 10 11
時間計測
juliaで作業の時間を計測するには、関数の先頭に@time
をつければよいです。例えば大きな行列を2つ作り、その行列積にかかる時間を計測してみましょう。
A = rand(1000, 1000)
B = rand(1000, 1000)
@time C = A * B
0.093328 seconds (2 allocations: 7.629 MiB)
(以下、行列の中身が表示される)
また、ベンチマークツールを用いることもできます。まず、BenchmarkTools
というパッケージをインストールしましょう。 以下を実行してください。これは一度だけでOKです。
import Pkg
Pkg.add("BenchmarkTools")
これは、パッケージを追加するためのパッケージであるPkg
を読み込み、それを経由してBenchmarkTools
をインストールしています。 このパッケージは初期状態では準備されていないので、上記を用いてインストールする必要があります。
ひとたびインストールすると、これを使える様になります。以下のようにしてBenchmarkTools
パッケージを インポートしましょう。
using BenchmarkTools
これも、プログラムの中で1度行うだけでいいです。
次に、実際に計測してみましょう。
@benchmark C = A * B
ここでは自動的に処理を何度も実行し、以下のようにビジュアルに結果を出力してくれます。
BenchmarkTools.Trial: 45 samples with 1 evaluation.
Range (min … max): 73.526 ms … 188.175 ms ┊ GC (min … max): 0.00% … 0.00%
Time (median): 114.416 ms ┊ GC (median): 0.00%
Time (mean ± σ): 112.045 ms ± 22.360 ms ┊ GC (mean ± σ): 0.12% ± 0.32%
▂█ ▂▂
▅▅▅██▁▁▅▅█▁█▁▁▁▁▁▅█▅█████▁▅▅▁██▁▁█▅▁▅▁▅▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▅ ▁
73.5 ms Histogram: frequency by time 188 ms <
Memory estimate: 7.63 MiB, allocs estimate: 2.
関数に「!」マーク
関数名の最後に!
をつけると、その関数は「破壊的」であることを示します。これは、関数が引数を変更することを意味します。 例えば次を考えましょう。
arr = [10; 20; 30]
push!(arr, 40)
4-element Vector{Int64}:
10
20
30
40
ここでは、push!
という関数は、ベクトルの一番最後に要素を追加してくれます。この関数は、引数であるベクトルarr
の 中身を変更します。なので、関数名に!
がついています。同様に、pop!
という関数は、ベクトルの一番最後の要素を取り除いてくれます。
pop!(arr)
arr # 表示
3-element Vector{Int64}:
10
20
30
この!
をつけるという操作はjuliaにおける慣習であり、単なる命名規則になっています。皆さんも、自分で関数を作る際に、それが引数を変更する場合は!
をつけるようにしましょう。
やってみよう:
上記を写経しましょう
複雑な内包表記を書いてみましょう。
これまでに作ったプログラムについて、時間を計測してみましょう。
これまでに作ってプログラムについて、内容を変更するものがあったなら、
!
をつけてみましょう。
チーム作業
それではチームに分かれてもらいます。
最適化や数値計算に関するトピックを調べ、それらをJuliaで実装してみてください。
トピックについて、例えば下記の書籍の目次などが参考になるかもしれません。
寒野善博,"最適化手法入門",講談社,2019:幅広く最適化について説明がある入門書です。寒野先生の講義の動画も参照ください。
梅谷俊治,"しっかり学ぶ数理最適化",講談社,2020:様々な最適化問題について広く触れられている見取り図です。
M. J. Kochenderfer amd T. A. Wheeler, "最適化アルゴリズム", 共立出版, 2022:Juiaによる豊富なソースコードが記載されています。
永井佑紀,"Juliaではじめる数値計算入門",技術評論社,2024:Juliaのコードがついている数値計算入門書です。
今週と来週に色々実装してもらい、その次の週に発表を行ってもらいます。