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の面白い点として、これを本当に「」というキーワードでも表現できます。この記号をブラウザ上でコピーしてcolab上に張り付けて以下のようにして実行してみてください。この表記は、10 in xと全く同じ意味になります。
10 ∈ x
TABキーを押すことで「」という記号を得ることが出来ます。このやり方は簡単でオススメなのですが、2025/5時点だとそのようなTAB補完はcolab上では実行できないようです。もう一つ、juliaの面白い演算子である近似演算子「≈」を紹介します。この演算子は、二つのベクトルが似ているとtrueを、そうでなければfalseを返します。
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個分です。また、インデントは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でランダムベクトルを作って検証してみる。
逆行列が計算できる例とできない例を作ってみる。
などです。今週と来週に色々実装してもらい、その次の週に発表を行ってもらいます。