2016-05-03 65 views
3

到文件我正在尋找在朱莉婭一些功能堪比Matlab的保存變量在運行時

save('myfile.mat', 'myvar1', 'myvar2') 

例如,使用HDF5.jl,這是很容易做到

@write filename myvar1 myvar2 

但這要求我確切知道要將哪些變量寫入文件。

我希望能夠在運行時間,在函數範圍內選擇要寫入的變量,並使用符號或字符串指定它們的名稱。

vars = [:myvar1, :myvar2] 
@write filename vars 

什麼是最好的方法來實現這一目標?

編輯

我知道,我可以使用save從JLD.jl爲save("file.jld", "myvar1", myvar1)。但我希望能夠挽救未在編譯時已知變量列表,允許save一個電話(或類似):

if condition 
    myvar1 = 1 
    vars = [:myvar1] 
else 
    myvar1 = 1 
    myvar2 = 2 
    vars = [:myvar1, :myvar2] 
end 

# what goes here? 
save(filename, vars...) 

回答

2

你可能想看看在JLD package,這基於HDF5構建,更好地支持用戶定義的Julia類型。 HDF5和JLD都提供了save的函數,它們爲變量提供運行時名稱。

+0

我知道我可以爲變量提供運行時名稱。但我想選擇要在運行時保存的變量列表。我看到的所有解決方案都使用'save'等方式,要求將變量名稱寫入源代碼中。請參閱我的編輯。 –

+0

@MicahSmith你可以用'eval()'來計算這些變量。例如:'myvar1 = 1;瓦爾=:myvar1; save(「save.jld」,string(vars),eval(vars))' –

+0

@張實唯謝謝,這幾乎是缺少的一塊。我寫道,我正在尋找可能在*函數範圍內工作的解決方案,並且'eval(vars)'將在全局範圍之外失敗。 –

2

您可以使用serializedeserialize

vars = Dict() 
if condition 
    myvar = 1 
    vars[:myvar1] = myvar1 
else 
    myvar1 = 1 
    myvar2 = 2 
    vars[:myvar1] = myvar1 
    vars[:myvar2] = myvar2 
end 

f = open(filename, "w") 
serialize(f, vars) 
close(f) 

閱讀:

f = open(filename, "r") 
vars = deserialize(f) 
close(f) 

,如果你並不需要保存的變量名可以使用數組而不是字典:vars = []

+2

這會起作用,但應該注意的是,不建議使用'serialize''' deserialize'來獲取超過瞬態數據的持久性,因爲數據格式在Julia版本中並不穩定。 – StefanKarpinski