Week 5: グループワーク1(1回目)

今日やること

はじめに

  • 最初に少し講義をします。

  • その後、チームに分かれて作業を行います。

比較演算子

ある二つの変数の間に成り立つ関係を記述するものを比較演算子といいます。例えば、

a = 3
b = 4

としたときに、

a == b

とすると、abが等しいかどうかを判定します。これは数学でいう「==」です。この場合はfalseになります。

false

同様に、a != bの表記で、abが等しくないかどうかを判定します。これは数学でいう「\ne」です。この場合はtrueになります。

true

同様に、a < bの表記で、abより小さいかどうかを判定します。これは数学でいう「<<」と同じです。また、a <= bの表記で、等号も含んで判定します。つまり「\le」です。大なり小なりが逆の場合も定義されています。

a < b   # true
a <= b  # true
a > b   # false
a >= b  # false

さて、もう一段ハイレベルなものとして、ベクトル(配列)の中にある値が含まれているかどうかをinというキーワードで調べることができます。これは数学でいう「\in」です。

x = [1; 2; 3; 4; 5]

として、

3 in x

とすると

true

になります。一方、

10 in x

false

になります。 さて、Juliaの面白い点として、これを本当に「\in」というキーワードでも表現できます。SagaMaker Studio上で、「\」「i」「n」と打ったあと、 TABキーを押してください。すると、「\in」という記号に変換されます。これを用いても大丈夫です。

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ということです。

⚠ Note

ベクトルの中身を表示するには、インデクスのほうを指定して以下のようにも書けます。

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

やってみよう:

  • 上記を写経してみましょう。

  • 色々な条件を組み合わせて、forwhileを書いてみましょう。

  • 二重ループで行列の中身を表示してみましょう。また、for v in xスタイルで行列の中身を表示するにはどうすればいいでしょうか?

チーム作業

それではチームに分かれてもらいます。

線形代数の講義の内容で納得のいっていない点とか、いまいち腑に落ちない点とかを議論してください。

それらをJuliaで実装してみてください。

例えば、

  • 線形独立という概念がよくわからない。実際にJuliaでランダムベクトルを作って検証してみる。

  • 逆行列が計算できる例とできない例を作ってみる。

などです。今週と来週に色々実装してもらい、その次の週に発表を行ってもらいます。

CC BY-SA 4.0 Yusuke Matsui. Last modified: July 11, 2024. Website built with Franklin.jl and the Julia programming language.