プログラミング覚書(Julia)
Matlabに似ている。シンプルかつ数学的にわかりやすい記述のルールが魅力的。欠測値など不規則なデータが扱いづらい。数値シミュレーション専用に使っている。
基本操作(VSCode使用を前提)
packageをインストール "]" + "add xxx"
Alt + Enter (全実行)
Shift + Enter (ラインを実行して次のラインにカーソルを移す。RのCtrl +Enter)
Ctrl + Enter (ラインを実行)
comment/uncomment Ctrl + / あるいは #= ... =#で囲む
REPL(Matlabのcommand windowに相当)に出力
println()
背景テーマはDark Visualstudioが自分は見やすい
別ファイルに作った自作のfunctionを呼ぶ:
include(file name)
スクリプト内に簡単なfunctionをつくる:
function eslowe(tc)
es = 6.107799961+tc*(4.436518521*(10^-1)+tc*(1.428945805*(10^-2)
+tc*(2.650648471*(10^-4)+tc*(3.031240396*(10^-6)+tc*(2.034080948*(10^-8)+tc
*6.136820929*(10^-11))))))
return es
end
for loop内で新しく定義された変数は、loopの外(globalかlocal変数)で定義しておかないと内部変数として外部からは認識されない。
コードを印刷
PrintCodeをインストール > F1
出力をREPLかスクリプト内に出力させるかなどを変更
File > Preferences > Settings > Extensions > Julia > Result Type
Arrayの計算
配列の数が同じ場合
A = rand(5)
B = rand(5)
C = A + B
配列の数が異なる場合(Broadcasting)や、配列の除算、乗算のときは . を使用
A = rand(5)
B = 3
C = A .+ B
配列の抜き出しに際する注意点
上記の変数Gについて、G[1:2]、G[1 : 2]、G[1 : 2]ではエラーがでないが、G[1 : 2]ではエラーとなる。
配列の条件検索Matlabと同じで .& あるいは .| (スカラーの比較 には&& や||を用いてもよい e.g., i > 1 && j > 1)
データ操作
NaNを含む平均
mean(filter(!isnan, A))
最大最小
Aの中の最大最小
maximum(A), minimum(A)
大きい方、小さい方
max(A, B), min(A, B)
条件指定は各条件を括弧で
findA =
(ttimenum .> T - 15 * 60 * 1e3) .&
(ttimenum .<= T + 15 * 60 * 1e3)
検索には
T[.findA]
missing データを扱う場合
missingの配列 f = ismissing.(A)
missingでない配列 (上のコマンドに続けて) .!f
配列を抽出するとき(Matlabのfindに対応)findall(ismissing, A)
平均操作 mean(skipmissing(A))
単調増加(減少)のベクトルを作成
A = collect(1 : 2 : 10)
内挿(例は変数'albedo'の欠損値を内挿で補完)
using Interpolations
itp = LinearInterpolation(timenum[isfinite.(albedo)],albedo[isfinite.(albedo)],extrapolation_bc=Linear())
albedo[isnan.(albedo)]=itp(timenum[isnan.(albedo)])
ループ
for i = 0:dt:tmax
end
時間データ
1秒以下のデータを読むには
df = DateFormat("y-m-d H:M:S.s")
timenum = DateTime.(TTIME, df)
Matlabのdatenumのように*時間データを数値に変換する(平均操作や時間の丸め込みなどに利用)
timenum_value = Dates.value.(timenum)
*ただしMatlabの1が24時間に対し、下記のttimenumの1は1ミリセカンド
上記のttimenum_valueを一般時間データに変換しなおす
st = DateTime("0/12/31 0:00:00")
ttimenum = st .+ Millisecond.(ttimenum_value)
特殊な操作
デバッグ
(1) 一度全実行 (ここで基本的なエラーを取り除く必要があるのが手間)
(2) Breakpointを設定
(3) @run function name
for loop内で新しく定義された変数は、loopの外(globalかlocal変数)で定義しておかないと内部変数として外部からは認識されない(のでデバッグが難しい)。
変数のcopyについて
A=[1,2,3]
B=A
A[1]=2
println(B[1])とすると2が出力される。これを防ぐにはA = copy(B)とする。しかし、左辺で特定の領域を参照しない場合はB=Aでもよい。上記の例で、A=2としてもBは変わらない。