プログラミング覚書(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は変わらない。