Извиняется, если этот довольно общий - хотя и еще вопрос кодирования.
С небольшим количеством времени на моих руках я пытался узнать немного Julia
. Я подумал, что хорошим началом было бы скопировать функцию R
microbenchmark
, чтобы я мог легко сравнивать функции R и Julia.
например. это microbenchmark
вывод для 2 R-функций, которые я пытаюсь подражать:
Unit: seconds
expr min lq median uq max neval
vectorised(x, y) 0.2058464 0.2165744 0.2610062 0.2612965 0.2805144 5
devectorised(x, y) 9.7923054 9.8095265 9.8097871 9.8606076 10.0144012 5
Итак, до сих пор в Джулии я пытаюсь написать идиоматический и, надеюсь, понятный/сложный код. Поэтому я заменил двойной цикл со списком, чтобы создать массив таймингов, например:
function timer(fs::Vector{Function}, reps::Integer)
# funs=length(fs)
# times = Array(Float64, reps, funs)
# for funsitr in 1:funs
# for repsitr in 1:reps
# times[reps, funs] = @elapsed fs[funs]()
# end
# end
times= [@elapsed fs[funs]() for x=1:reps, funs=1:length(fs)]
return times
end
Это дает массив таймингов для каждой из двух функций:
julia> test=timer([vec, devec], 10)
10x2 Array{Float64,2}:
0.231621 0.173984
0.237173 0.210059
0.26722 0.174007
0.265869 0.208332
0.266447 0.174051
0.266637 0.208457
0.267824 0.174044
0.26576 0.208687
0.267089 0.174014
0.266926 0.208741
Мой вопрос (наконец): как я идиоматически применяю такую функцию, как min
, max
, median
для столбцов (или строк) массива без использования цикла?
Я могу, конечно, сделать это легко для этого простого случая с циклом (sim, который я перечеркнул выше), но я не могу найти что-либо в документах, что эквивалентно словам apply(array,1, fun)
или даже colMeans
.
Ближайшая родовая функция, о которой я могу думать,
julia> [mean(test[:,col]) for col=1:size(test)[2]]
2-element Array{Any,1}:
0.231621
0.237173
.., но синтаксис действительно действительно не привлекателен. Есть ли более естественный способ для apply
функций по столбцам или строкам многомерного массива в Julia?