Я занимаюсь научной обработкой изображений в MATLAB, которая требует решения странных задач оптимизации со многими параметрами, которые используются функцией «эксперимента», которая имеет много разных «вспомогательных функций», которые используют различные подмножества параметров.Передача этих параметров является трудной задачей, и мне бы хотелось элегантное расширяемое решение.
Мое предпочтительное решение - это «относительная глобальная» переменная - общая для рабочего пространства «основной» функции, а также любые подфункции, которыевызовы основных функций и которые указывают, что они хотят разделить эту переменную.Но относительная глобальная переменная не будет существовать вне функции, которая ее объявляет, и исчезнет, как только вернется основная функция.
Код будет выглядеть следующим образом, за исключением того, что будет много других дополнительных_переменных_переменных, каждый из которых использует параметры вразличные способы:
function y = experiment(p1,p2,p3,...)
% declare relative global variables.
% these will not change value within this experiment function,
% but this experiment will be reused several times in the calling function,
% each time with different parameter values.
relative global p1, p2, p3 ...
% load and process some data based on parameters
...
% call the helper + return
y = experiment_helper(y,z);
end
function y = experiment_helper(y,z)
relative global p1, p3
%% do some stuff with y, z, possibly using p1 and p3, but not changing either of them.
...
end
Я понимаю, что вы можете получить желаемое поведение несколькими другими способами - вы можете передать параметры подфункциям, вызванным в эксперименте, вы можете поместить параметры в параметрструктурировать и передавать их подфункциям и т. д.Первое ужасно, потому что мне приходится менять аргументы всех подфункций каждый раз, когда я хочу изменить использование параметров.Во-вторых, все в порядке, но мне нужно включать префикс структуры каждый раз, когда я хочу использовать переменные.
Полагаю, что «правильное» решение моей проблемы состоит в том, чтобы использовать структуры опций, аналогичные тем, что делает Matlab в своих собственныхкод оптимизации.Мне просто интересно, не существует ли более ловкого способа, при котором я не буду вводить «paramStruct.value» каждый раз, когда я хочу использовать параметр «значение».
Я понимаю, что относительные глобальные переменные могут вызывать всеКошмары отладки, но я не думаю, что они обязательно будут хуже, чем те, которые вызваны существующими глобальными переменными.И они, по крайней мере, имели бы больше локальности, чем неквалифицированные глобалы.
Так как же настоящий программист справится с этой проблемой?Существует ли элегантный, простой в создании и обслуживании дизайн для такого рода проблем?Это можно сделать в Matlab?Если нет, как бы вы сделали это на другом языке?(Я всегда чувствую себя виноватым из-за использования Matlab, так как это не совсем поощряет хороший дизайн. Я всегда хочу переключиться на Python, но не могу оправдать переучивание вещей и перенос базы кода - если только это не сделает меня намного более быстрым и лучшим программистомв течение нескольких недель, и специфичные для Matlab инструменты, такие как вейвлет и наборы инструментов для оптимизации, могут быть быстро + легко найдены или продублированы в Python.)