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

今日やること

はじめに

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

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

関数

関数とは、複数の作業を一つのものにまとめ、再利用できるようにしたものです。使い方としては数学の関数と似ています。 まず、既に準備されている関数を使ってみましょう。Juliaには基本的な数学関数が最初から入っていますここではサイン関数を呼んでみましょう。

sin(5)

ここではsinの値が計算されます。

-0.9589242746631385

また、πという記号が用意されています("\", "p", "i", TABです)。それを使ってみると、予想通り0になることがわかります。

sin(π)
0.0

さて、それでは自分で関数を作ってみましょう。ここではf(x)=1x+3xf(x) = \frac{1}{x} + 3xという関数を作ってみます。以下を入力し、セルを実行してください。

function f(x)
    y = 1 / x + 3 * x
    return y
end

そして、別のセルで以下を実行し、関数を作れていることを確認してください。

f(2)
6.5

さて、関数を記述する際は、上記のように、

  • function」+「スペース」+「関数名」+「(」+引数+「)」

  • 改行

  • インデントしたうえで関数の中身

  • 改行

  • end

とします。

関数名は何でもいいです。引数部分は、後に述べるように複数あってもいいです。

関数の中身には何を書いても大丈夫です。最後にreturn XXXという形で、関数が返す値(戻り値)を決めています。

上記の例ではyという変数に結果を代入していますが、次のように直接return内容を書くこともできます。

function f(x)
    return 1 / x + 3 * x
end

また、juliaでは3 * xのような直接的な掛け算の計算は、3xとまるで数学のように省略表記することが出来ます。よって、上記は次のようにも書けます。

function f(x)
    return 1 / x + 3x
end

さらに、juliaでは上記のように戻り値が1つの関数は、通常の数学のように次のように定義できます。

f(x) = 1 / x + 3x

これは他の言語にはない、かなり特殊な書き方になっています。機能としては、functionをつけた場合と全く同じです。 便利ですので覚えておくといいです。

⚠ Note

notebook環境では、

  • 別のセルで同じ名前の関数を作りセルを実行した場合、関数が上書きされます。

  • 関数が書かれているセルの中身を変更して再度そのセルを実行した場合も、関数の中身が上書きされます。

  • 関数が書かれたセルを実行してそのセルを削除しても、関数は定義されて残っているままなので注意してください。

さて、関数は引数を2つ以上持つこともできます。また、関数名や変数名は複数文字でも大丈夫です。 そして、関数の中身はなんでも大丈夫です。以下を見てみましょう。

function say(str, num)
    for n in 1:num
        println(str)
    end
end

この関数は、strという文字列とnumという整数を引数に取り、strnum回表示する関数です。以下を実行してみてください。

say("ramen", 3)
ramen
ramen
ramen

となることがわかります。

また、返り値が2つ以上になっても大丈夫です。

function split(vec, k)
    v1 = vec[1:k]
    v2 = vec[k:end]
    return v1, v2
end

上記は、あるベクトルについて、前からk番目までの位置でベクトルをちぎり、その前半後半を返す関数です。次のようになります。

x = [1; 2; 3; 4; 5]
x1, x2 = split(x, 2)
println(x1)
println(x2)
[1, 2]
[2, 3, 4, 5]

上記のように2つ以上の戻り値がある場合は、イコールの左側に複数変数をおき、受け取ります。

やってみよう:

  • 上記を写経しましょう

  • juliaに実装されている数学関数を調べ、それらを使って何か関数を作ってみましょう。また、それらの関数を、f(x) = ...の形式で書いてみましょう。

配列

さて、ここでは本来はもっと早く習うのが普通である、配列について勉強しましょう。juliaでは次の書き方で配列が記載できます。

x = [10, "hoge", 23.4]

この結果は以下のようになります。それぞれの要素が入った縦ベクトル(的なもの)になっていることがわかります。

3-element Vector{Any}:
 10
   "hoge"
 23.4

このように、配列とは任意の要素をとることが出来るデータ構造です。すべての基本です。 要素には次のようにベクトルと同様にアクセスできます。

x[1]  # 10
x[2]  # "hoge"
x[3]  # 23.4

実はこの書き方はベクトルと全く同じであり、中身が数字の場合は自動的にベクトルになります。

⚠ Note
実は数列を見るとベクトルそのものになり、x = [1, 2, 3]は縦ベクトルにになります。しかしこのコンマを用いた記法は 行列の記載時に勘違いしやすいので、本講義では縦ベクトルはすべてセミコロンで区切るスタイルに統一しています。

辞書

さて、配列やベクトルは、「要素の集合」であり、要素は順番に並んでいるため添字(数字)でアクセスできる、というものでした。一方で、同様に要素の集合ですが「文字列でアクセスできる」ものを、辞書とよびます。辞書は次のように作成できます。

d = Dict()

ここで、辞書には添字の代わりに文字列を使ってアクセスできます。

d["abc"] = 123         # 数字をいれられるし
d["xxx"] = "hogehoge"  # 文字列などもいれられる。

これらの要素には、d["abc"]のようにしてアクセスしたり、更新したりできます。

また、辞書の中身を一覧表示するには、次のような形のforループでアクセスできます。

for (key, value) in d
    println(key, ": ", value)
end

この結果は次のようになります。

abc: 123
xxx: hogehoge

やってみよう:

  • 上記を写経しましょう

  • 配列や辞書にいろいろなものを入れてみましょう。ベクトルや行列を入れてみましょう。

  • 辞書のほうが一般化されていて便利なように思いませんか?ここで、配列(およびベクトル)が優れている点は何か、考えてみましょう。

チーム作業

先週に引き続き、チームに分かれて作業してもらいます。線形代数の内容について、Juliaで実際に計算してみてください。

今週いろいろと実装したりしてみて、次回に発表してもらいます。

発表時間は「1チーム3分」を目安にしてください。

発表では、ペアのどちらかが、zoomに入って画面共有してもらいます。

それをスクリーンに投影します。SageMaker Stuild Labsの画面を映して説明してもらってもいいですし、パワーポイントなどでスライドを作ってもらってそれを使って発表してもいいです。

今日終わらなければ、次回までに頑張って作ってきてください。

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