julia - 在 Julia 中解包返回地图
问题描述
我有一个返回数组的函数。我想将函数映射到输入向量,输出是所有数组的简单串联。功能是:
function log_it(r, bzero = 0.25, N = 400)
main = rand(Float16, (N+150));
main[1] = bzero;
for i in 2:N+150
main[i] = *(r, main[i-1], (1-main[i-1]))
end;
y = unique(main[(N+1):(N+150)]);
r_vec = repeat([r], size(y)[1]);
hcat(r_vec, y)
end;
我可以很好地映射它:
map(log_it, 2.4:0.001:2.405)
但结果很糟糕:
[2.4 0.58349609375]
[2.401 0.58349609375]
[2.402 0.583984375; 2.402 0.58349609375]
[2.403 0.583984375]
[2.404 0.583984375]
[2.405 0.58447265625; 2.405 0.583984375]
注意,嵌套数组的长度是无限的——我正在寻找一种不依赖于预先知道嵌套数组长度的解决方案。
我想要的是这样的:
2.4 0.583496
2.401 0.583496
2.402 0.583984
2.402 0.583496
2.403 0.583984
2.404 0.583984
2.405 0.584473
2.405 0.583984
我使用 for 循环制作的:
results = Array{Float64, 2}(undef, 0, 2)
for i in 2.4:0.001:2.405
results = cat(results, log_it(i), dims = 1)
end
results
代码运行良好,但 for 循环大约需要四倍的时间。我也觉得 map 是正确的方法,我只是错过了一些东西 - 要么以返回一个很好的数组向量的方式执行 map,要么在数组的某些突变中“unnest”。我尝试过查看 flatten 和 collect 等功能,但找不到任何东西。
提前谢谢了!
解决方案
你确定你的基准测试正确吗?尤其是对于非常快速的操作,基准测试有时会很棘手。作为一个起点,我建议确保您始终将要进行基准测试的任何代码包装到一个函数中,并使用BenchmarkTools包来获得可靠的计时。
在 Julia 中编写循环通常不会造成性能损失,因此与map
听起来可疑的相比,循环的运行时间增加了 3 倍。
这是我得到的:
julia> using BenchmarkTools
julia> @btime map(log_it, 2.4:0.001:2.405)
121.426 μs (73 allocations: 14.50 KiB)
julia> function with_loop()
results = Array{Float64, 2}(undef, 0, 2)
for i in 2.4:0.001:2.405
results = cat(results, log_it(i), dims = 1)
end
results
end
julia> @btime with_loop()
173.492 μs (295 allocations: 23.67 KiB)
所以循环慢了大约 50%,但那是因为你分配了更多。
当你使用广播map
时,通常有一种更加 Julia 的方式来表达你正在做的事情。这适用于任何用户定义的函数:
julia> @btime log_it.(2.4:0.001:2.405)
121.434 μs (73 allocations: 14.50 KiB)
相当于你的map
表情。我认为你正在寻找的只是一种堆叠所有结果向量的方法 - 你可以使用vcat
和喷溅:
julia> @btime vcat(log_it.(2.4:0.001:2.405)...)
122.837 μs (77 allocations: 14.84 KiB)
并确认:
julia> vcat(log_it.(2.4:0.001:2.405)...) == with_loop()
true
因此,在解决方案的速度和内存成本下,使用广播和连接会产生与循环相同的结果map
。
推荐阅读
- vb.net - 限制输入到组合框时消耗的 Ctrl + V KeyEventArgs 和 KeyPressEvent
- python-2.7 - 使用退格会在 raw_input 中添加一些 utf 字符
- java - 按下按钮时不会重置时间
- javascript - 如何从 Accuweather api 获取城市的唯一 ID?
- php - FFI API 受限
- python-3.x - 在 Tkinter 中动态调整图像大小
- django - django模板网址问题
- wix - WiX 安装程序添加注册表项的问题
- evernote - 有没有办法在 Evernote iOS SDK 中将笔记转换为 HTML 文件
- react-native - 无法让 Appium 与 Expo 在设备或模拟器上运行(这甚至可能吗?)