在函数内的 for 循环内修改变量
Modify variables inside a for loop within a function
在下面的函数中
function foo(g)
a = [g * sqrt(i) for i in 1:4]
b = [g * i ^ 2 for i in 1:4]
for j in [a, b]
j /= sum(j)
println(j)
end
return a, b
end
foo(2)
我希望打印值与返回值一致。相反,返回值不反映第 5 行中执行的除法。结果是
[0.16270045344786252, 0.2300931878702196, 0.2818054517861928, 0.32540090689572504]
[0.03333333333333333, 0.13333333333333333, 0.3, 0.5333333333333333]
([2.0, 2.8284271247461903, 3.4641016151377544, 4.0], [2, 8, 18, 32])
我在 the Julia forum 上看到了一个讨论,其中一位用户在 REPL 会话中遇到了类似的问题。但建议的解决方案是将 for 循环包装在一个函数中,我已经完成了,或者写 global j \= sum(j)
的等价物代替第 5 行,这不会改变结果。
类似的建议出现在这个 SE 问题中:Changing variable in loop [Julia]
如何在返回之前批量修改 a
和 b
?
您需要向量化除法并使用 Float64
arg:
function foo(g)
a = [g * sqrt(i) for i in 1:4]
b = [g * i ^ 2 for i in 1:4]
for j in [a, b]
j ./= sum(j)
println(j)
end
return a, b
end
现在:
julia> foo(2.0)
[0.16270045344786252, 0.2300931878702196, 0.2818054517861928, 0.32540090689572504]
[0.03333333333333333, 0.13333333333333333, 0.3, 0.5333333333333333]
([0.16270045344786252, 0.2300931878702196, 0.2818054517861928, 0.32540090689572504], [0.03333333333333333, 0.13333333333333333, 0.3, 0.5333333333333333])
现在是棘手的解释
- 当你传递一个
Int
参数时,在你的代码中 a
是 Float64
的 Vector
而 b
是 Vector
共 Int
秒。看看将它们结合起来会发生什么:
julia> [[1.0,2.0],[1,2]]
2-element Array{Array{Float64,1},1}:
[1.0, 2.0]
[1.0, 2.0]
Julia 将所有数据带到公共 Float64,在您的情况下,您丢失了参考信息!
j =/ sum(j)
是一个线性代数除法,它分配了一个新对象。你想要一个元素明智的操作,所以你需要矢量化。
在下面的函数中
function foo(g)
a = [g * sqrt(i) for i in 1:4]
b = [g * i ^ 2 for i in 1:4]
for j in [a, b]
j /= sum(j)
println(j)
end
return a, b
end
foo(2)
我希望打印值与返回值一致。相反,返回值不反映第 5 行中执行的除法。结果是
[0.16270045344786252, 0.2300931878702196, 0.2818054517861928, 0.32540090689572504]
[0.03333333333333333, 0.13333333333333333, 0.3, 0.5333333333333333]
([2.0, 2.8284271247461903, 3.4641016151377544, 4.0], [2, 8, 18, 32])
我在 the Julia forum 上看到了一个讨论,其中一位用户在 REPL 会话中遇到了类似的问题。但建议的解决方案是将 for 循环包装在一个函数中,我已经完成了,或者写 global j \= sum(j)
的等价物代替第 5 行,这不会改变结果。
类似的建议出现在这个 SE 问题中:Changing variable in loop [Julia]
如何在返回之前批量修改 a
和 b
?
您需要向量化除法并使用 Float64
arg:
function foo(g)
a = [g * sqrt(i) for i in 1:4]
b = [g * i ^ 2 for i in 1:4]
for j in [a, b]
j ./= sum(j)
println(j)
end
return a, b
end
现在:
julia> foo(2.0)
[0.16270045344786252, 0.2300931878702196, 0.2818054517861928, 0.32540090689572504]
[0.03333333333333333, 0.13333333333333333, 0.3, 0.5333333333333333]
([0.16270045344786252, 0.2300931878702196, 0.2818054517861928, 0.32540090689572504], [0.03333333333333333, 0.13333333333333333, 0.3, 0.5333333333333333])
现在是棘手的解释
- 当你传递一个
Int
参数时,在你的代码中a
是Float64
的Vector
而b
是Vector
共Int
秒。看看将它们结合起来会发生什么:
Julia 将所有数据带到公共 Float64,在您的情况下,您丢失了参考信息!julia> [[1.0,2.0],[1,2]] 2-element Array{Array{Float64,1},1}: [1.0, 2.0] [1.0, 2.0]
j =/ sum(j)
是一个线性代数除法,它分配了一个新对象。你想要一个元素明智的操作,所以你需要矢量化。