6

Ich habe eine Julia-Funktion in einer Datei. Sagen wir, es ist das Folgende. Jetzt möchte ich Argumente in diese Funktion einreichen. Ich habe versucht zu tunPass Funktionsargumente in Julia nicht interaktiv

julia filename.jl randmatstat(5) 

aber einen Fehler gibt, dass ‚(‘ Token ist unerwartet. Nicht sicher, was die Lösung wäre. Ich bin auch ein wenig zerrissen auf, wenn es eine Hauptfunktion ist/wie eine vollständige schreiben .? Lösung Julia mit zum Beispiel, was die Start-/Einstiegspunkt eines Julia-Programm ist

function randmatstat(t) 
    n = 5 
    v = zeros(t) 
    w = zeros(t) 
    for i = 1:t 
     a = randn(n,n) 
     b = randn(n,n) 
     c = randn(n,n) 
     d = randn(n,n) 
     P = [a b c d] 
     Q = [a b; c d] 
     v[i] = trace((P.'*P)^4) 
     w[i] = trace((Q.'*Q)^4) 
    end 
    std(v)/mean(v), std(w)/mean(w) 
end 

Antwort

1

Julia keinen "Einstiegspunkt" als solche haben. Wenn Sie julia myscript.jl vom Terminal anrufen, bitten Sie im Wesentlichen Julia, das Skript auszuführen und zu beenden. Daher muss es ein Skript sein. Wenn alles, was Sie in Ihrem Skript haben, eine Funktionsdefinition ist, dann wird es nicht viel tun, wenn Sie diese Funktion später nicht von Ihrem Skript aus aufrufen.

Wie für Argumente, wenn Sie julia myscript.jl 1 2 3 4 aufrufen, werden alle verbleibenden Argumente (d. H. In diesem Fall 1, 2, 3 und 4) ein Array von Zeichenfolgen mit dem speziellen Namen ARGS. Sie können diese spezielle Variable verwenden, um auf die Eingabeargumente zuzugreifen.

z.B. wenn Sie eine julia Skript haben, die einfach sagt:

# in julia mytest.jl 
show(ARGS) 

Dann ist dieser Aufruf aus dem Linux-Terminal wird dieses Ergebnis geben:

<bashprompt> $ julia mytest.jl 1 two "three and four" 
UTF8String["1","two","three and four"] 

EDIT: Also, was ich aus Ihrem Programm zu verstehen, Sie möchten wahrscheinlich so etwas tun (Anmerkung: In Julia muss die Funktion definiert werden, bevor sie aufgerufen wird).

# in file myscript.jl 
function randmatstat(t) 
    n = 5 
    v = zeros(t) 
    w = zeros(t) 
    for i = 1:t 
     a = randn(n,n) 
     b = randn(n,n) 
     c = randn(n,n) 
     d = randn(n,n) 
     P = [a b c d] 
     Q = [a b; c d] 
     v[i] = trace((P.'*P)^4) 
     w[i] = trace((Q.'*Q)^4) 
    end 
    std(v)/mean(v), std(w)/mean(w) 
end 

t = parse(Int64, ARGS[1]) 
(a,b) = randmatstat(t) 
print("a is $a, and b is $b\n") 

Und dann rufen Sie diese von Ihrem Linux-Terminal in etwa so:

julia myscript.jl 5 
+0

Hinweis: Wenn Sie die Ausgabe über das Skript an das Linux-Terminal senden möchten, müssen Sie dies explizit mit dem Befehl print (oder etwas Ähnlichem) abfragen. Auch dies ist nur eine Demo, in einem richtigen Programm sollten Sie testen, ob der Benutzer die richtige Anzahl von Argumenten gegeben hat, um Benutzerfehler zu vermeiden. –

+0

Falls Sie nicht gerade vom Linux-Terminal aus gestartet sind, sondern nur Ihr Ergebnis erhalten haben, und Sie es gerne in der interaktiven julia-Eingabeaufforderung tun und Sie einfach wissen möchten, wie Sie ein Skript ausführen, dann müssen Sie nur '' (journal prompt) '' (myscript.jl) '' einschließen –

3

Fügen Sie den folgenden in Ihre Julia-Datei:

### original file 
function randmatstat... 
... 
end 

### new stuff 
if length(ARGS)>0 
    ret = eval(parse(join(ARGS," "))) 
end 
println(ret) 

Jetzt können Sie laufen:

julia filename.jl "randmatstat(5)" 

Wie ursprünglich versucht. Beachten Sie die zusätzlichen Anführungszeichen, die hinzugefügt werden, um sicherzustellen, dass die Klammern den Befehl nicht durcheinander bringen.

Erläuterung: Die Variable ARGS wird von Julia definiert, um die Parameter für den Befehl zu speichern, der die Datei ausführt. Da Julia ein Interpreter ist, können wir diese Parameter zu einem String join parsen, als Julia-Code parsen, ausführen und das Ergebnis ausdrucken (der Code entspricht dieser Beschreibung).

+0

ist es eine Möglichkeit, die Optionen verwendet, zu erfassen, wenn julia zu beginnen? oder diese können nur über andere Konstanten abgerufen werden? wie 'julia -p 2' kann mit' nprocs() ' – amrods

+1

' opts = Base.JLOptions() 'erhalten alle" rohen "Optionen von Julia verwendet werden. Die Struktur hat mehrere Felder, die interpretiert werden müssen. Sehen Sie sich 'base/options.jl' für Details an.Vielleicht ist auch eine OS-spezifische Möglichkeit, die Befehlszeile von der PID zu bekommen, eine Option;) –

4

können Sie laufen versuchen, wie so:

julia -L filename.jl -E 'randmatstat(5)'

+1

Das wird "funktionieren", aber streng genommen ist es nicht die Antwort auf OPs Problem, da es das Problem "Was ist der Einstiegspunkt?" Umgeht eines julia-Programms ". Dies stellt lediglich sicher, dass die im Dateinamen definierte Funktion zuerst geladen wird, und führt dann eine beliebige Anweisung aus. Es lohnt sich, das Missverständnis auszuräumen, dass eine in einer Datei definierte Funktion direkt aufgerufen werden kann, da dies wahrscheinlich von Leuten stammt, die aus der Matlab-Welt kommen. –