Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Julia-for循环中的迭代索引_Loops_Iteration_Julia - Fatal编程技术网

Loops 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

我必须在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 (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。一个简单的性能改进是从循环中提取一些逻辑。我将编辑带有一些注释的解决方案是的,对于这种情况,没有区别:-但是对于我代码中的其他情况,有一些区别