ジュリアで.matのようにデータを保存する方法
概要
JLD.jl
は、Juliaを使用している間に発生する一時データを保存することができるパッケージだ1。純粋なJuliaプロジェクトを進行している際、データの入出力が面倒であれば役立つ。一方で、JLD.jl
のインタフェースをより直感的に改善したJLD2.jl
も利用可能である。2このポストに紹介された内容は、おおよそこのような機能があるということを認識し、可能な限りJLD2.jl
を使用することをお勧めする。下位互換性も問題なくサポートされる。
一方で、matファイルのようなものではなく、正確にマットラボのmatファイルを読み書きしたい場合は、MAT.jl
パッケージを参照してください。
コード
using JLD
cd(@__DIR__); pwd()
numpad = reshape(1:9, 3,3)
cube = zeros(Int64, 3,3,3)
save("mydata.jld", "numpad",numpad, "cube",cube)
mydata = load("mydata.jld")
mydata["numpad"]
mydata["cube"]
実行結果
julia> numpad = reshape(1:9, 3,3)
3×3 reshape(::UnitRange{Int64}, 3, 3) with eltype Int64:
1 4 7
2 5 8
3 6 9
julia> cube = zeros(Int64, 3,3,3)
3×3×3 Array{Int64, 3}:
[:, :, 1] =
0 0 0
0 0 0
0 0 0
[:, :, 2] =
0 0 0
0 0 0
0 0 0
[:, :, 3] =
0 0 0
0 0 0
0 0 0
julia> save("mydata.jld", "numpad",numpad, "cube",cube)
┌ Warning: JLD incorrectly extends FileIO functions (see FileIO documentation)
└ @ FileIO C:\Users\rmsms\.julia\packages\FileIO\5JdlO\src\loadsave.jl:215
保存されるファイルの拡張子は*.jld
でなければならない。保存される各データの名前を文字列で与え、割り当てられた変数を連続してつなげると、そのデータが一つにまとめて保存される。
julia> mydata = load("mydata.jld")
┌ Warning: JLD incorrectly extends FileIO functions (see FileIO documentation)
└ @ FileIO C:\Users\rmsms\.julia\packages\FileIO\5JdlO\src\loadsave.jl:215
Dict{String, Any} with 7 entries:
"_creator\\JULIA_PATCH" => 0x00000001
"cube" => [0 0 0; 0 0 0; 0 0 0]…
"_creator\\WORD_SIZE" => 64
"numpad" => [1 4 7; 2 5 8; 3 6 9]
"_creator\\JULIA_MINOR" => 0x00000006
"_creator\\ENDIAN_BOM" => 0x04030201
"_creator\\JULIA_MAJOR" => 0x00000001
結果を見ると、辞書が返された。保存時に文字列で与えられた名前がキーkeyとして入り、実際のデータは値valueにある。次のように、辞書として参照すればいい。
julia> mydata["numpad"]
3×3 reshape(::UnitRange{Int64}, 3, 3) with eltype Int64:
1 4 7
2 5 8
3 6 9
julia> mydata["cube"]
3×3×3 Array{Int64, 3}:
[:, :, 1] =
0 0 0
0 0 0
0 0 0
[:, :, 2] =
0 0 0
0 0 0
0 0 0
[:, :, 3] =
0 0 0
0 0 0
0 0 0
JLD2
例で、文字列で辞書を作る過程が不便だったが、JLD2.jl
ではネームドタプルを使って、同じ機能をより便利に利用することができる。