在函数内的 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]

如何在返回之前批量修改 ab

您需要向量化除法并使用 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 参数时,在你的代码中 aFloat64VectorbVectorInt 秒。看看将它们结合起来会发生什么:
    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) 是一个线性代数除法,它分配了一个新对象。你想要一个元素明智的操作,所以你需要矢量化。