coo*_*lsv 3 iteration loops julia
我必须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
Run Code Online (Sandbox Code Playgroud)
在每次迭代中,我希望 的第i-th 元素result填充函数的结果,该函数使用iarray 的第 -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
Run Code Online (Sandbox Code Playgroud)
但它不起作用。有什么提示吗?
您当前正在将结果初始化为一维数组,但它们实际上是二维的。所以需要如下切换结果
\n\nresult = fill(Array{Float64}(undef,0,0),6,1)\nRun Code Online (Sandbox Code Playgroud)\n\n您不需要对类型进行任何转换,下面的代码就可以工作。
\n\nfor (index, value) in enumerate([0.5,0.75,1,1.25,1.5,2])\n result[index]=exp.(-(E.^2/D)/(2*value*k))\nend\nRun Code Online (Sandbox Code Playgroud)\n\n您无需初始化结果,只需映射值即可,这样会更容易阅读。
\n\nresult = map(x -> exp.(-(E.^2/D)/(2*x*k)), [0.5, 0.75, 1, 1.25, 1.5, 2])\nRun Code Online (Sandbox Code Playgroud)\n\n关于性能的一些评论
\n\nusing BenchmarkTools\n\nfunction t1()\n result=fill(Array{Float64}(undef,0,0),6,1)\n E=rand(5,5)\n D=3.27\n k=2\n for (index, value) in enumerate([0.5,0.75,1,1.25,1.5,2])\n result[index]=exp.(-(E.^2/D)/(2*value*k))\n end\nend\n\nfunction t2()\n E=rand(5,5)\n D=3.27\n k=2\n result = map(x -> exp.(-(E.^2/D)/(2*x*k)), [0.5, 0.75, 1, 1.25, 1.5, 2])\nend\n\n@btime t1() # 4.904 \xce\xbcs (49 allocations: 9.66 KiB)\n@btime t2() # 4.812 \xce\xbcs (50 allocations: 9.64 KiB)\nRun Code Online (Sandbox Code Playgroud)\n\n正如您所看到的,性能没有真正的差异。如果您想提高性能,那么最简单的方法就是尝试将常量从内部循环中取出。
\n\nfunction t3()\n E=rand(5,5)\n D=3.27\n k=2\n f = -(E.^2/D)/(2*k)\n result = map(x -> exp.(f/x), [0.5, 0.75, 1, 1.25, 1.5, 2])\nend\n\n@btime t3() # 3.168 \xce\xbcs (31 allocations: 5.53 KiB) \nRun Code Online (Sandbox Code Playgroud)\n