6

Ho una funzione di Julia in un file. Diciamo che è il sotto. Ora voglio passare argomenti in questa funzione. Ho provato a farePassare argomenti di funzione in Julia in modo non interattivo

julia filename.jl randmatstat(5) 

ma questo dà un errore che '(' token è inaspettato. Non sono sicuro che la soluzione sarebbe quella. Sono anche un po 'strappata su se c'è una funzione principale/come scrivere una piena .? soluzione con Julia per esempio qual è il punto di partenza/inserimento di un programma di Julia

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 

risposta

1

Julia non ha un "punto di ingresso" in quanto tale. Quando si chiama julia myscript.jl dal terminale, si sta essenzialmente chiedendo a julia di eseguire lo script ed uscire. In quanto tale, deve essere una sceneggiatura. Se tutto quello che hai nel tuo script è una definizione di funzione, allora non farà molto a meno che tu non chiami successivamente quella funzione dal tuo script.

Come per gli argomenti, se si chiama julia myscript.jl 1 2 3 4, tutti gli argomenti rimanenti (vale a dire in questo caso 1, 2, 3 e 4) diventano un array di stringhe con il nome speciale ARGS. È possibile utilizzare questa variabile speciale per accedere agli argomenti di input.

ad es. se si dispone di uno script di Julia che dice semplicemente:

# in julia mytest.jl 
show(ARGS) 

quindi chiamare questo dal terminale di Linux darà questo risultato:

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

EDIT: Quindi, da quello che ho capito dal programma, probabilmente vorrai fare qualcosa di simile (nota: in julia, la funzione deve essere definita prima che venga chiamata).

# 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") 

e quindi chiamare questo dal vostro terminale linux in questo modo:

julia myscript.jl 5 
+0

Nota: se si desidera inviare l'output al terminale linux dal proprio script, è necessario richiederlo esplicitamente con il comando print (o qualcosa di equivalente). Inoltre, questa è solo una demo, in un programma corretto dovresti provare se l'utente ha dato il giusto numero di argomenti, ecc. Per evitare errori dell'utente. –

+0

Inoltre, nel caso in cui quello che cercavi non fosse specificamente eseguito dal terminale Linux, ma ottenendo solo i tuoi risultati, e sei felice di farlo nel prompt interattivo di julia, e vuoi solo sapere come eseguire uno script, allora tutto ciò che devi fare è 'include (" myscript.jl ")' al prompt di julia –

3

Aggiungere il seguente al file Giulia:

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

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

Ora, è possibile eseguire:

julia filename.jl "randmatstat(5)" 

Come inizialmente tentato. Notare le citazioni aggiuntive aggiunte per assicurarsi che le parentesi non rovinino il comando.

Spiegazione: La variabile ARGS è definita da Julia per contenere i parametri sul comando che esegue il file. Poiché Julia è un interprete, siamo in grado di aggiungere questi parametri a join in una stringa, analizzarlo come codice Julia, eseguirlo e stampare il risultato (il codice corrisponde a questa descrizione).

+0

c'è un modo per catturare le opzioni usate quando si inizia julia? o quelli possono essere recuperati solo tramite altre costanti? come 'julia -p 2' può essere ottenuto con' nprocs() ' – amrods

+1

' opts = Base.JLOptions() 'fornisce tutte le opzioni" raw "usate da Julia. La struttura ha diversi campi che devono essere interpretati. Guarda 'base/options.jl' per i dettagli.Forse qualche modo specifico per ottenere la riga di comando dal PID potrebbe anche essere un'opzione;) –

4

Si può provare a correre in questo modo:

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

+1

Questo "funzionerà" ma in senso stretto non è la risposta al problema dell'OP, in quanto ignora il problema di "qual è il punto di ingresso di un programma di Julia ". Ciò garantisce semplicemente che la funzione definita nel nome del file sia caricata per prima, e quindi esegue un'istruzione arbitraria. Vale la pena chiarire il fraintendimento che una funzione definita in un file può essere chiamata direttamente, poiché ciò probabilmente deriva da persone che provengono dal mondo MATLAB. –