抱歉,如果这相当普遍 - 虽然仍然是一个编码问题.
有一点时间在我的手上,我一直在努力学习一点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
Run Code Online (Sandbox Code Playgroud)
所以到目前为止,在朱莉娅,我正在尝试编写惯用语和希望可理解/简洁的代码.因此,我用列表推导替换了一个双循环来创建一个时序数组,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
这为2个函数中的每一个提供了一系列时序:
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
Run Code Online (Sandbox Code Playgroud)
我的问题(最终)是我怎么惯用应用功能,如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
Run Code Online (Sandbox Code Playgroud)
..但语法确实没有吸引力.apply在Julia中,是否有更自然的方式跨多维数组的列或行进行操作?