Week 5: グループワーク1(1回目)
今日やること
はじめに
最初に少し講義をします。
その後、チームに分かれて作業を行います。
比較演算子
ある二つの変数の間に成り立つ関係を記述するものを比較演算子といいます。例えば、
a = 3
b = 4
としたときに、
a == b
とすると、a
とb
が等しいかどうかを判定します。これは数学でいう「」です。この場合はfalse
になります。
false
同様に、a != b
の表記で、a
とb
が等しくないかどうかを判定します。これは数学でいう「」です。この場合はtrue
になります。
true
同様に、a < b
の表記で、a
がb
より小さいかどうかを判定します。これは数学でいう「」と同じです。また、a <= b
の表記で、等号も含んで判定します。つまり「」です。大なり小なりが逆の場合も定義されています。
a < b # true
a <= b # true
a > b # false
a >= b # false
さて、もう一段ハイレベルなものとして、ベクトル(配列)の中にある値が含まれているかどうかをin
というキーワードで調べることができます。これは数学でいう「」です。
x = [1; 2; 3; 4; 5]
として、
3 in x
とすると
true
になります。一方、
10 in x
は
false
になります。 さて、Juliaの面白い点として、これを本当に「」というキーワードでも表現できます。SagaMaker Studio上で、「\」「i」「n」と打ったあと、 TAB
キーを押してください。すると、「」という記号に変換されます。これを用いても大丈夫です。
10 ∈ x
もう一つ、juliaの面白い演算子である近似演算子「≈」を紹介します。この演算子は、二つのベクトルが似ているとtrueを、そうでなければfalseを返します。 「\」「a」「p」「p」「r」「o」「x」と打って、TAB
キーを押すと打てます。
x = [0.1; 0.2]
y = [0.1; 0.2000000001]
x ≈ y
これは
true
となります。ここで、ゼロの個数を減らしてみてください。するとそのうちfalseになります。
論理演算子
数学や記号論理学の講義で、真偽値に対して「AND」や「OR」を考えたと思います。同様のことがプログラミングでも行えます。 ここで、「かつ」は「&&
」、「または」は「||
」、否定は「!
」です。
a = 3
b = 4
a < b && a > 2
これは
true
となります。
また、
a >= b && a > 2
は
false
となります。
!(a > 2)
は
false
です。
やってみよう:
上記を写経してみましょう。
色々な変数を組み合わせて演算子を使ってみて、どのようになるか見てみましょう。ベクトルや行列や文字列に対して比較演算子や論理演算子を使うとどうなりますか?
制御構文
さて、だんだんプログラミングっぽくなってきます。条件により処理を分岐することを制御といいます。この際、if
というキーワードを使います。例えば以下では、a
の値に応じて処理を分岐させています。
a = 4
if a > 3
println("aは3より大きい")
end
この結果は、a
は実際のところ3より大きいので、
aは3より大きい
となります。ここでa
の値を変えてみると、条件が分岐することがわかります。
このように、julia
では条件による処理の分岐を記述する際はif
, end
を使います。if
の直後の部分がtrue
の際はその直下にすすみ、false
の際はend
以下まで飛びます。 if
からend
までの間には複数行処理を書くこともできます。
また、ここでは「インデント」といって、適切に空白を挿入することが推奨されています。たとえば半角スペース4個分です。SageMaker Studio上で改行すると、 自動的にインデントが入るはずです。また、インデントはTAB
キーをおして挿入でき、また、Shift
+TAB
で削除できます。
さて、if
文にはelse
を使って、条件がfalse
の場合の処理を記述することもできます。
s = "fuga"
if s == "hoge"
println("Hoge!")
else
println("Not Hoge!")
end
この結果は以下になります。
Not Hoge!
このように、a
がfalseの場合の処理も記述できます。
さらに、else
の後にif
を使って、条件を追加することもできます。これをelse if
といいます。
x = 0.5
if x < 0.3
println("xは小さい")
elseif x < 0.7
println("xは中くらい")
else
println("xは大きい")
end
この結果は以下になります。
xは中くらい
次に、繰り返しを学びましょう。while
は、その直後がtrueの間、処理を進めるというものです。
i = 1
while i <= 5
println(i)
i += 1
end
としてみてください。この結果は以下になります。
1
2
3
4
5
ここでは、i
が5以下の間、while
の中身が何度も繰り返されます。ここではループの中でi
に1を足し続けているので、ループが5周して終了します。while
は、次に習うfor
ほどは使わないかもしれないのですが、 「ベクトルがある条件を満たすまで処理を適用し続ける」といった、繰り返し回数が不明な場合に使うことがあります。
次にfor
です。こちらは非常によく使います。for
には非常にたくさんの書き方があるのですが、まずは基本となる「数字の連番を回る」やり方を学びましょう。次を実行してみてください。
for i in 1:5
println(i)
end
これは
1
2
3
4
5
となります。すなわち、
for
の直後に置いたi
という変数がループを司る変数です。ループ変数などとも呼ばれます。この中身が更新されていきます。これどのような変数名でもいいです。in
というキーワードを置きますその後に、範囲を指定します。ここでは1から5までなので、
1:5
とします。
これにより、
i
には1が入ってfor
,end
の中身を実行i
には2が入ってfor
,end
の中身を実行
・・・という風に、処理が5回繰り返されます。
同様の表記で、ベクトルの中身をループすることもできます。
x = [10; 20; 30; 40; 50]
for v in x
println(v)
end
これは
10
20
30
40
50
となります。すなわち、i in
の後ろの部分には範囲を示す1:5
が来てもいいし、ベクトルのようなものが来てもOKということです。
ベクトルの中身を表示するには、インデクスのほうを指定して以下のようにも書けます。
for i in 1:5
println(x[i])
end
これはc言語的な書き方です。こちらでもいいのですが、iを使わない場合は、for v in x
のように書くことが多いです。
また、二重ループを書くこともできます。
for i in 1:2
for j in 1:3
println("i=", i, ", j=", j)
end
end
これは
i=1, j=1
i=1, j=2
i=1, j=3
i=2, j=1
i=2, j=2
i=2, j=3
となります。
juliaではこれは以下のように省略表記することもできます。
for i in 1:2, j in 1:3
println("i=", i, ", j=", j)
end
やってみよう:
上記を写経してみましょう。
色々な条件を組み合わせて、
for
やwhile
を書いてみましょう。二重ループで行列の中身を表示してみましょう。また、
for v in x
スタイルで行列の中身を表示するにはどうすればいいでしょうか?
チーム作業
それではチームに分かれてもらいます。
線形代数の講義の内容で納得のいっていない点とか、いまいち腑に落ちない点とかを議論してください。
それらをJuliaで実装してみてください。
例えば、
線形独立という概念がよくわからない。実際にJuliaでランダムベクトルを作って検証してみる。
逆行列が計算できる例とできない例を作ってみる。
などです。今週と来週に色々実装してもらい、その次の週に発表を行ってもらいます。