6

У меня есть функция Julia в файле. Скажем, это ниже. Теперь я хочу передать аргументы в эту функцию. Я пытался делатьНевозможно передать аргументы функции в Julia

julia filename.jl randmatstat(5) 

, но это дает ошибку, что «(» маркер является неожиданным. Не уверен, что решение будет. Я тоже немного порвано на если есть главная функция/как писать полный .? решение с использованием Джулии Например, что является точкой старта/записи программы Юлия

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 

ответ

1

Джулия не имеет «точку входа» как таковой. Когда вы вызываете julia myscript.jl с терминала, вы, по сути, просите julia выполнить сценарий и выйти. Таким образом, это должен быть сценарий. Если все, что у вас есть в вашем скрипте, является определением функции, то это не будет делать многого, если вы позже не назовете эту функцию из вашего скрипта.

Что касается аргументов, если вы вызываете julia myscript.jl 1 2 3 4, все остальные аргументы (т. Е. В этом случае, 1, 2, 3 и 4) становятся массивом строк со специальным именем ARGS. Вы можете использовать эту специальную переменную для доступа к входным аргументам.

например. если у вас есть JuLiA скрипт, который просто говорит:

# in julia mytest.jl 
show(ARGS) 

Затем называют это из Linux терминала даст этот результат:

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

EDIT: Итак, из того, что я понял из вашей программы, вы, вероятно, захотите сделать что-то вроде этого (примечание: в julia функция должна быть определена до ее вызова).

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

А потом называют это с вашего Linux терминала так:

julia myscript.jl 5 
+0

Примечание. Если вы хотите выводить на терминал linux из своего сценария, вам нужно запросить его явно с помощью команды печати (или что-то эквивалентное). Кроме того, это просто демоверсия, в правильной программе, которую вы должны тестировать, если пользователь дал правильное количество аргументов и т. Д., Чтобы предотвратить ошибку пользователя. –

+0

Кроме того, в случае, если вы не были специально запущены с терминала linux, но просто получили свой результат, и вы счастливы сделать это в интерактивной подсказке julia, и вы просто хотите знать, как запустить скрипт, то все, что вам нужно сделать, это 'include (" myscript.jl ")' в приглашении julia –

3

Добавьте следующие строки в файл Julia:

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

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

Теперь вы можете запустить:

julia filename.jl "randmatstat(5)" 

Попытка первоначально. Обратите внимание на добавленные дополнительные кавычки, чтобы убедиться, что скобка не испортила команду.

Объяснение: Переменная ARGS определена Джулией для хранения параметров команды, запускающей файл. Поскольку Julia является интерпретатором, мы можем join эти параметры в строку, проанализировать ее как код Юлии, запустить ее и распечатать результат (код соответствует этому описанию).

+0

есть способ, чтобы захватить параметры, используемые при запуске Юлю? или они могут быть получены только через другие константы? как 'julia -p 2' можно получить с помощью' nprocs() ' – amrods

+1

' opts = Base.JLOptions() 'дает все« необработанные »параметры, используемые Julia. Структура имеет несколько полей, которые необходимо интерпретировать. Посмотрите на 'base/options.jl' для деталей.Возможно, какой-то конкретный OS-код для получения командной строки из PID также может быть опцией;) –

4

Вы можете попробовать запустить так:

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

+1

Это будет «работать», но, строго говоря, это не ответ на проблему OP, поскольку она обходит вопрос «что такое точка входа программы julia ». Это просто гарантирует, что функция, определенная в имени файла, сначала загружается, а затем выполняет произвольный оператор. Стоит очистить недоразумение, что функцию, определенную в файле, можно вызвать напрямую, поскольку это, вероятно, происходит от людей, поступающих из мира matlab. –

Смежные вопросы