Julia:更改函数中选择的可变结构属性
Julia: changing mutable struct attribute of choice in function
我正在 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)
这样我就可以使用任何一组 args,更改 args 中的任何参数 P,并能够使用任意性能函数。为了说明 args 是否被定义为参数类型,
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)
我不知道该怎么做。使用字典有什么巧妙的方法吗?还是一种更好的方法来满足我的要求,完全避免直接操作可变结构?谢谢
您可以将 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
类型的类型定义。
我正在 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)
这样我就可以使用任何一组 args,更改 args 中的任何参数 P,并能够使用任意性能函数。为了说明 args 是否被定义为参数类型,
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)
我不知道该怎么做。使用字典有什么巧妙的方法吗?还是一种更好的方法来满足我的要求,完全避免直接操作可变结构?谢谢
您可以将 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
类型的类型定义。