Юлия: изменение атрибута изменяемой структуры по выбору в функции - PullRequest
0 голосов
/ 07 июня 2018

Я создаю простую функцию стохастической оптимизации в Джулии и использую изменяемую структуру для хранения значений параметров.По сути, я изменяю параметр в изменяемой структуре, передаю эти параметры через функцию производительности и обновляю параметр на основе производительности.

У меня есть версия, которая работает, когда я вручную указываю, какие параметры я хотел бы изменить,Тем не менее, я хотел бы обобщить это, чтобы я мог изменить любой данный параметр.Например, обозначая изменяемую структуру параметров как «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 в аргументах и ​​иметь возможность использовать произвольную функцию производительности.Чтобы проиллюстрировать, что аргументы определены как имеющие тип 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)

Я не могу работатькак это можно сделать.Есть ли какой-нибудь умный способ использования словарей?Или лучший способ, который удовлетворяет тому, что я хочу, избегая прямого манипулирования изменчивыми структурами вообще?Спасибо

1 Ответ

0 голосов
/ 07 июня 2018

Вы можете использовать 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 типа, если вы добавляете больше параметров.

...