Loops Julia-for循环中的迭代索引
我必须在Julia中编写一个非常简单的for循环,我将其复制如下:Loops Julia-for循环中的迭代索引,loops,iteration,julia,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个元素填充函数的结果,该函数使用数组[0.5,0.75,1,1.25,1.5,2]的第I个元素。所以我不知道在括号里放什么。 到目前为止,我试过了 for (in
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个元素填充函数的结果,该函数使用数组[0.5,0.75,1,1.25,1.5,2]的第I个元素。所以我不知道在括号里放什么。
到目前为止,我试过了
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
但它不起作用。有什么提示吗?假设结果应该是矩阵向量:
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
您当前正在将结果初始化为一维数组,但它们实际上是二维的。因此,您需要如下切换结果
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)
天哪,这太简单了。。。感谢您提供有关阵列初始化的提示-我以前用你的地图版本写过代码,但我正试图重写我的全部代码,以便Julia能更快地运行它。关于map vs for有很多讨论,我正在比较我的代码的两个版本,其中所有的map案例都被for循环替换,这样我就可以保持最快的解决方案。我看不到这两个实现之间有显著的性能差异。运行BenchmarkTools@btime为每个解决方案提供4.9μs。一个简单的性能改进是从循环中提取一些逻辑。我将编辑带有一些注释的解决方案是的,对于这种情况,没有区别:-但是对于我代码中的其他情况,有一些区别