我必须在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]
但是它不起作用。有提示吗?
答案 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