2016-05-03 6 views
3

ich mich für einige Funktionen in Julia vergleichbar mit MatlabVariablen speichern zur Laufzeit-Datei

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

Zum Beispiel suchen, mit HDF5.jl, ist es leicht

@write filename myvar1 myvar2 

Aber um dies zu tun erfordert, dass ich genau weiß, welche Variablen ich in die Datei schreiben möchte.

Ich möchte in der Lage sein zu wählen, welche Variablen zur Laufzeit in einem Funktionsumfang schreiben und ihre Namen mit Symbolen oder Zeichenfolgen angeben.

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

Was wäre der beste Weg, dies zu erreichen?

EDIT

Ich weiß, dass ich save von JLD.jl als save("file.jld", "myvar1", myvar1) verwenden können. Aber ich will in der Lage sein, eine Liste von Variablen zu speichern, die zum Zeitpunkt der Kompilierung nicht bekannt sind, so dass ein einziger Aufruf zu save (oder ähnlich):

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

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

Antwort

2

Sie können einen Blick auf die JLD package nehmen wollen, die baut auf HDF5 mit besserer Unterstützung von benutzerdefinierten Julia-Typen auf. Sowohl HDF5 als auch JLD stellen Funktionen für save bereit, die Laufzeitnamen für Variablen enthalten.

+0

Ich weiß, dass ich Laufzeitnamen für Variablen zur Verfügung stellen könnte. Aber ich möchte die Liste der Variablen auswählen, die zur Laufzeit gespeichert werden. Alle Lösungen, die ich mit 'save' usw. sehe, erfordern, dass der Variablenname in die Quelle geschrieben wird. Bitte sehen Sie meine Bearbeitung. –

+0

@MicahSmith Sie können diese Variablen mit 'eval()' berechnen. Zum Beispiel: 'myvar1 = 1; vars =: myvar1; speichern ("save.jld", string (vars), eval (vars)) –

+0

@ 张 实 唯 Danke, das ist fast das fehlende Stück. Ich habe geschrieben, dass ich nach einer Lösung suche, die in * Funktionsumfang * funktionieren könnte und 'eval (vars)' wird außerhalb des globalen Gültigkeitsbereichs fehlschlagen. –

2

können Sie verwenden serialize und deserialize:

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) 

zu lesen:

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

wenn Sie Variablennamen nicht speichern müssen Sie Array statt dict verwenden können: vars = []

+2

Dies funktioniert, aber es sollte beachtet werden, dass die Verwendung von 'serialize' /' deserialize' für mehr als transiente Daten nicht empfohlen wird, da das Datenformat in Julia-Versionen nicht stabil ist. – StefanKarpinski