loops - Julia for 循环中的迭代索引
问题描述
我必须for
在 Julia 中编写一个非常简单的循环,我在下面重现:
result=fill([],6,1)
E=rand(5,5)
D=3.27
k=2
for s in [0.5,0.75,1,1.25,1.5,2]
result[??]=exp.(-(E.^2/D)/(2*s*k))
end
在每次迭代中,我希望的i
-th 元素result
填充函数的结果,该函数使用i
array 的 -th 元素[0.5,0.75,1,1.25,1.5,2]
。所以我不知道在括号内放什么[??]
。到目前为止,我尝试过
for (index, value) in enumerate([0.5,0.75,1,1.25,1.5,2])
result["$index"]=exp.(-(E.^2/D)/(2* "$value" *k))
end
但它不起作用。有什么提示吗?
解决方案
您当前正在将结果初始化为一维数组,但它们实际上是二维的。所以需要切换结果如下
result = fill(Array{Float64}(undef,0,0),6,1)
您不需要对类型进行任何转换,以下将正常工作。
for (index, value) in enumerate([0.5,0.75,1,1.25,1.5,2])
result[index]=exp.(-(E.^2/D)/(2*value*k))
end
无需初始化结果,您也可以映射这些值,这变得更容易阅读。
result = map(x -> exp.(-(E.^2/D)/(2*x*k)), [0.5, 0.75, 1, 1.25, 1.5, 2])
对性能的一些评论
using BenchmarkTools
function t1()
result=fill(Array{Float64}(undef,0,0),6,1)
E=rand(5,5)
D=3.27
k=2
for (index, value) in enumerate([0.5,0.75,1,1.25,1.5,2])
result[index]=exp.(-(E.^2/D)/(2*value*k))
end
end
function t2()
E=rand(5,5)
D=3.27
k=2
result = map(x -> exp.(-(E.^2/D)/(2*x*k)), [0.5, 0.75, 1, 1.25, 1.5, 2])
end
@btime t1() # 4.904 μs (49 allocations: 9.66 KiB)
@btime t2() # 4.812 μs (50 allocations: 9.64 KiB)
如您所见,性能没有真正的区别。如果您想提高性能,那么尝试将常量从内部循环中拉出来是最简单的。
function t3()
E=rand(5,5)
D=3.27
k=2
f = -(E.^2/D)/(2*k)
result = map(x -> exp.(f/x), [0.5, 0.75, 1, 1.25, 1.5, 2])
end
@btime t3() # 3.168 μs (31 allocations: 5.53 KiB)
推荐阅读
- nginx - nginx正则表达式位置
- angular - 多次发出 RxJS http 请求
- apache-kafka - Kafka主题名称可以参数化吗?
- c++ - c ++简单删除向量重复导致分段错误
- authentication - 创建并激活没有权限的目录帐户
- android - Firebase 测试实验室 Android Emulator 或物理设备更新 WebView 版本
- docker - 解析 docker 容器内的站点主机名
- javascript - 自动向左水平滚动表格(使用 HTML、CSS 或 JQuery)
- lua - lua 子字符串替换 2 模式
- c++11 - Boost asio 解析器被单元化