6

Dosyada Julia işlevi var. Diyelim ki aşağıda. Şimdi argümanları bu işleve aktarmak istiyorum. Ben Etkileşim bağımsız değişkenlerini Julia'ya etkileşimli olmayan şekilde aktarın

julia filename.jl randmatstat(5) 

yapıyor denedim ama bu bir hata verdiğini '(' belirteci beklenmeyen bir durumdur. Çözümdür. Ben de duyuyorum ne olacağını emin değil biraz tam yazmayı bir ana işlevi/varsa üzerinde yırtık .? Julia kullanarak çözüm Julia Programı başlangıç ​​/ giriş noktası nedir Örneğin

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 

cevap

1

Julia gibi bir "giriş noktası" yoktur. Terminalden julia myscript.jl numaralı telefonu aradığınızda, julia'nın komut dosyasını yürütmesini ve çıkmasını rica ediyoruz. Bu nedenle, bir senaryo olması gerekiyor. Komut dosyanızdaki tek şey bir işlev tanımıysa, daha sonra bu işlevi komut dosyanızdan çağırmazsanız fazla bir şey yapmayacaktır. bağımsız değişkenler için de

, sen julia myscript.jl 1 2 3 4 çağrısı, geri kalan tüm argümanlar (yani, bu durumda, 1, 2, 3 ve 4 olarak), özel isim ARGS dizeleri bir dizi haline gelir. Giriş değişkenlerine erişmek için bu özel değişkeni kullanabilirsiniz.

örn. Eğer bir Julia komut dosyası varsa basitçe diyor ki:

# in julia mytest.jl 
show(ARGS) 

Sonra linux terminalden bu çağırarak bu sonucu verecektir:

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

DÜZENLEME: Yani, programınız anladığımız kadarıyla, Muhtemelen böyle bir şey yapmak istersiniz (not: julia'da, işlev çağrılmadan önce tanımlanmalıdır).

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

Ve sonra şöyle Eğer linux terminalden diyoruz: Julia başlatırken kullanılan seçenekleri yakalamak için bir yol

julia myscript.jl 5 
+0

Not: Eğer linux terminaline betiğinizden çıktı almak isterseniz, bunu print komutuyla (veya eşdeğer bir şeyle) açıkça talep etmeniz gerekir. Ayrıca, bu sadece bir demo, kullanıcı hatalarını önlemek için kullanıcı doğru sayıda argüman vb verdikten sonra test etmeniz gereken uygun bir programdır. –

+0

Ayrıca, peşinden koştuğunuz şey linux terminalinden özel olarak çalışmıyordu, ama sadece sonuca ulaşıyordu ve etkileşimli julia isteminde bunu yapmaktan mutlu oluyorsunuz ve sadece bir komut dosyasının nasıl çalıştırılacağını bilmek istiyorsunuz. sonra yapmanız gereken tek şey 'julia isteminde' include ("myscript.jl") 'dır –

3

sizin Julia dosyaya aşağıdaki satırları ekleyin: Artık

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

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

, Çalıştırabileceğiniz:Orijinal olarak denendiği gibi. Parantezin komutu bozmadığından emin olmak için eklenen ek alıntılara dikkat edin.

Açıklama: ARGS değişkeni, Julia'nın parametreleri çalıştıran komutu dosyada tutması için tanımlanmıştır. Julia bir tercüman olduğu için bu parametreleri bir dizgeye join yapabiliriz, Julia kodu olarak ayrıştırır, çalıştırır ve sonucu yazdırırız (kod bu açıklamaya karşılık gelir).

+0

var mı? ya da bunlar sadece başka sabitlerle alınabilir mi? julia -p 2 gibi nopcs() ' – amrods

+1

' opts = Base.JLOptions() 'ile elde edilebilir, Julia tarafından kullanılan tüm" ham "seçenekleri sunar. Yapı, yorumlanması gereken çeşitli alanlara sahiptir. Ayrıntılar için 'base/options.jl' dosyasına bakın.Belki de PID'den komut satırı almak için bazı işletim sistemlerine özgü bir yol da bir seçenek olabilir;) –

4

Öyle gibi çalıştırmayı deneyebilirsiniz:

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

+1

Bu "çalışacak" ama kesinlikle OP'nin sorununun cevabı değil, "giriş noktası ne" konusunu atladığından Julia programından " Bu sadece dosya isminde tanımlanan fonksiyonun önce yüklenmesini sağlar ve daha sonra keyfi bir deyimi çalıştırır. Bir dosyada tanımlanan bir fonksiyonun doğrudan çağrılabileceği, bu muhtemelen matlab dünyasından gelen insanlardan kaynaklandığı için yanlış anlaşılmayı ortadan kaldırmaya değer. –

İlgili konular