Я хочу написать скрипт experiment.m
, который будет вызывать сложную функцию с именем encoder(...)
. encoder
будет включать множество настроек, которые experiment.m
будет выбирать во время выполнения. В какой-то момент в experiment.m
настройки, которые будет использовать encoder
, будут созданы как переменные (в этом примере их две, в реальной жизни могут быть десятки):
blocklength = [some derivation];
bitdepth = [some derivation];
Я создаю структуру который хранит эти значения под своими именами:
encoder_settings = struct();
encoder_settings.blocklength = blocklength;
encoder_settings.bitdepth = bitdepth;
И я пишу свою функцию кодера следующим образом:
function encoder_out = encoder(data, encoder_settings)
blocklength = encoder_settings.blocklength;
bitdepth = encoder_settings.bitdepth;
[...]
end
Это прекрасно работает для кода средней сложности, но через некоторое время становится трудно поддерживать блоки create-struct / load-struct.
Альтернативы, которые я могу придумать, тоже не кажутся хорошими:
encoder
обычно очень сложен, и вызов переменных непосредственно из структуры в его теле делает код трудным для понимания. прочитайте. - Сделайте это динамически, используя eval, как это:
for s = fieldnames(my_struct)' eval([s{:},' = my_struct.', s{:}, ';']); end