logo

ジュリアで.matのようにデータを保存する方法 📂ジュリア

ジュリアで.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ではネームドタプルを使って、同じ機能をより便利に利用することができる。