gpt4 book ai didi

r - 按列或行操作的惯用 Julia 样式是什么?

转载 作者:行者123 更新时间:2023-12-03 11:00:07 25 4
gpt4 key购买 nike

如果这很笼统,请道歉 - 尽管仍然是一个编码问题。

有了一点时间,我一直在努力学习 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

这给出了两个函数中每一个的时序数组:
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在不使用循环的情况下跨数组的列(或行)?

对于这个带有循环的简单案例,我当然可以轻松完成(模拟我在上面划掉的那个) - 但我在文档中找不到任何相当于说 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 中跨多维数组的列或行的函数?

最佳答案

匿名函数 目前在 julia 中运行缓慢,因此除非您对匿名函数进行基准测试,否则我不会将它们用于基准测试。对于在代码的性能关键部分不使用匿名函数的代码,这将给出错误的性能预测。

我认为您希望缩减函数的两个参数版本,例如 sum(arr, 1) 对第一维求和。如果没有可用的库函数,您可以使用 reducedim

关于r - 按列或行操作的惯用 Julia 样式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20763229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com