Julia:更改函数中选择的可变结构属性

Julia: changing mutable struct attribute of choice in function

提问人:Arsibalt 提问时间:6/7/2018 更新时间:6/7/2018 访问量:1602

问:

我正在 Julia 中创建一个简单的随机优化函数,并使用可变结构来存储参数值。基本上,我在可变结构中更改一个参数,通过性能函数传递这些参数,并根据性能更新参数。

我有一个版本,当我手动指定要更改的参数时,该版本可以工作。但是,我想对此进行概括,以便我可以选择更改任何给定的参数。例如,将参数的可变结构表示为“args”,并且我正在更改参数“P”,我当前代码的关键部分如下所示:

args.P = P_new
loss_new = performance_function(args)
if loss_new < loss_old # performance better, keep the new value
    loss_old = loss_new
else # performance worse, go back to old value
    args.P = P_old
end

我想将其推广为一个函数:

update_parameter(args,P,performance_function)

这样我就可以使用任何一组参数,更改参数中的任何参数 P,并且能够使用任意性能函数。为了说明 args 是否被定义为 Parameter 类型,

mutable struct Parameter
    a::Float64
    b::Float64
end

args = Parameter(1,2)

然后我想使用相同的函数更新 a,然后更新 b,

update_parameter(args,a,performance_function)
update_parameter(args,b,performance_function)

我不知道该怎么做。有没有一些聪明的使用字典的方法?或者一种更好的方法来满足我的需求,完全避免直接操作可变结构?谢谢

结构 朱莉娅 可变

评论


答:

2赞 fredrikekre 6/7/2018 #1

您可以将给定的字段名称用作:setfield!Symbol

julia> mutable struct Parameter
           a::Float64
           b::Float64
       end

julia> function update!(parameters::Parameter, name::Symbol)
           setfield!(parameters, name, 5.0)
           return P
       end
update! (generic function with 1 method)

julia> P = Parameter(1, 2)
Parameter(1.0, 2.0)

julia> update!(P, :a)
Parameter(5.0, 2.0)

julia> update!(P, :b)
Parameter(5.0, 5.0)

但是,如果我正确理解您的用例,字典似乎会更简单,因为如果您添加更多参数,则不必更改类型的类型定义。Parameter

评论

0赞 Arsibalt 6/7/2018
这应该适用于我想要的,谢谢。对于一组定义的参数,我(目前)不需要添加更多参数。只是我有不同的参数集(并说)。然而,看看这将如何与词典一起工作会很有趣。Parameter1Parameter2