今回はJulia言語の複合体を扱います🐜
開発環境
開発環境は以下の通りです。
項目 | 内容 |
---|---|
OS | Windows 10 Home 64bit |
Julia | 1.6.3 |
Cmder | 1.3.14 |
※Cmderは必須ではありません
解説
複合体の書き方について、スクリプトを見ながら簡単に解説します。 以下をpointppolar.jlファイルとしてコピペして、動かしながら確認してください。
<スクリプト例>
struct Point x::Float64 y::Float64 end function radial(p::Point) r = sqrt(p.x^2 + p.y^2) end function angle(p::Point) r = atan(p.y / p.x) #r = atan(p.y, p.x) # こちらでもよい end function main() # xy座標点P p = Point(1.0, 1.0) # 各フィールドを表示 println(p.x) println(p.y) # 原点からの距離を計算 r = radial(p) θ = angle(p) # 計算結果を出力 println(r) println(θ) println(θ/pi*180) end if abspath(PROGRAM_FILE) == @__FILE__ main() end
<出力結果>
C:\ari23\dev\julia λ julia pointppolar.jl 1.0 1.0 1.4142135623730951 0.7853981633974483 45.0
極座標系
例として直交座標系から極座標系への変換を扱います。まず直交座標系とは、平面上に直交した2本の直線x軸とy軸において、交点または原点からの距離で位置を表現します((x, y)など)。
一方極座標系とは、始線(x軸)上にある極(原点)からの距離と偏角で位置を表現します((r, θ)など)。1
図で表すと以下の通りです。こちらの方がわかりやすいですね。
この直交座標系から極座標系へ変換する式を以下に示します。上の図と見比べながら、式を確認してください。
複合体
Julia言語での複合体とは、C言語などの構造体と同じで、複数の値(名前付きフィールド)をまとめて管理できる機能または型です。struct
文を使って、以下のように定義します。
struct 複合体名
~フィールド~
end
一般に::
を使って、フィールドに型注釈を付与します。
定義した複合体は、以下のように宣言することでオブジェクトを作ります。
オブジェクト = 複合体名(フィールド初期値)
ここで、上記スクリプト例を見てみましょう。
x座標とy座標の値をもつPoint型を定義し、初期値(1.0, 1.0)をもつオブジェクトp
を生成しています。
そして、この直交座標系にあるp
を、極座標系に変換する2つの関数radial
とangle
を使って計算しています。計算結果も正しいですね。
クラスを模倣
ところで、Julia言語にはJava言語にあるクラスという概念がありません。しかし、前回学習した「引数に型注釈を施す関数」を利用すると、上記のようにクラスを模倣することが可能です。
例として、以下にJavaで書いたPointクラスの一部を示します。上記スクリプト例と比べてみてください。※デバッグしてないので要注意
class Point{ double x, double y, pabulic double radial() { r = sqrt(this.x^2 + this.y^2) return r } }
その他詳細は公式ドキュメントを参照してください。
問題|点pの移動
Point型のオブジェクト点pを移動させる関数を作成してください。
回答はこちら。
おわりに
Juliaの複合体を簡単にまとめました。
Juliaにはクラスはありませんが、私はC言語から入ったクチなので、実はこの複合体の方がしっくりきます。
以上、参考になれば幸いです(^^)
次はこちら。
参考文献
参考文献は以下の通りです。
Julia Documentation
Julia公式のドキュメントです。英語ですが、とても丁寧に書かれていて、疑問はだいたい解消されるのではと思います。読み応えも十分。1から始めるJuliaプログラミング
公式ドキュメントの分量があまりに多くて、もう少しまとまったものが欲しいと思って購入しました。基本から応用まで幅広くカバーされつつ、量も丁度良いです。
-
このように平面上の極座標系を円座標といいます。↩