抱歉,如果这相当笼统 - 尽管仍然是一个编码问题。
有一点时间在我手上,我一直在努力学习一点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
到目前为止,在 Julia 中,我正在尝试编写惯用且希望可以理解/简洁的代码。因此,我用列表推导替换了一个双循环来创建一个时序数组,如下所示:
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
这为 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
我的问题(最后)是如何在不使用循环的情况下习惯性地跨数组的列(或行)应用函数,例如min
, ?max
median
对于这个简单的情况,我当然可以很容易地用一个循环(我在上面划掉的那个)来轻松地做到这一点——但我在文档中找不到任何相当于 sayapply(array,1, fun)
甚至colMeans
.
我能想到的最接近的通用函数是
julia> [mean(test[:,col]) for col=1:size(test)[2]]
2-element Array{Any,1}:
0.231621
0.237173
..但语法真的没有吸引力。在 Julia 中,是否有一种更自然的方法可以apply
跨多维数组的列或行执行函数?