Julia for循环中的迭代索引

时间:2019-08-10 21:16:08

标签: loops iteration julia

我必须在Julia中编写一个非常简单的for循环,下面将对此进行复制:

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的第result个元素,该结果使用数组{{ 1}}。因此,我不知道在括号i中放入什么。 到目前为止,我尝试过

[0.5,0.75,1,1.25,1.5,2]

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

2 个答案:

答案 0 :(得分:2)

您当前正在将结果初始化为一维数组,但实际上是二维数组。因此,您需要按以下方式切换结果

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) 

答案 1 :(得分:1)

假设result应该是矩阵的向量:

els = [0.5,0.75,1,1.25,1.5,2]
result=Vector{Matrix{Float64}}(undef, length(els))
E=rand(5,5)
D=3.27
k=2

for s in 1:length(els)
    result[s]=exp.(-(E.^2/D)/(2*s*k))
end