首页 > 解决方案 > 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填充函数的结果,该函数使用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

但它不起作用。有什么提示吗?

标签: loopsiterationjulia

解决方案


您当前正在将结果初始化为一维数组,但它们实际上是二维的。所以需要切换结果如下

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) 

推荐阅读