Установить рабочую область функции на базу в MATLAB
У меня довольно громоздкая программа, которую я запускаю как скрипт из командной строки MATLAB. Я решил немного очистить его с помощью некоторых вложенных функций (мне нужно хранить все в одном файле), но для того, чтобы это работало, мне потребовалось также сделать саму программу функцией. В результате программа больше не работает в базовом рабочем пространстве, как это было в сценарии. Это означает, что у меня больше нет доступа к десяткам полезных переменных, которые оставались после запуска программы, что важно для дополнительных вычислений и информации о запуске.
Предлагаемые обходные пути, которые я могу найти, должны использовать assignin
, evalin
, определите переменные как глобальные или установите выходные данные в определении теперь функционализированной программы. Однако ни одно из этих решений не привлекает меня, и я действительно хотел бы найти способ заставить само рабочее пространство основываться. Есть ли такой обходной путь? Или есть какой-то другой способ сделать это, который не требует от меня вручную определять или маркировать каждую конкретную переменную, которую я хочу получить из функции?
2 ответа
Функции должны четко определять входные и выходные переменные. Организация кода по-другому будет намного сложнее понять и изменить позже. В конце концов, вам, скорее всего, придется потратить больше времени на работу в неортодоксальном стиле, чем инвестировать в реструктуризацию.
Если у вас есть огромное количество выходных переменных, я бы предложил организовать их в структурные массивы, которые могут быть легко обработаны как выходные переменные.
Единственный неопрятный обходной путь, который я могу себе представить, это использовать whos, assignin и eval:
function your_function()
x = 'hello' ;
y = 'world' ;
variables = whos ;
for k=1:length(variables)
assignin('base',variables(k).name,eval(variables(k).name))
end
end
Но я сомневаюсь, что это поможет с целью очистить вашу программу. Как уже упоминалось выше, я предлагаю заказывать вещи вручную в структурах:
function out = your_function()
x = 'hello' ;
y = 'world' ;
out.x = x ;
out.y = y ;
end
Если функция, которую вы хотите определить, проста и имеет один выход, одним из вариантов является использование анонимных функций.
Другой вариант - сохранить все переменные, которые вы хотели бы использовать впоследствии, в struct
и ваша большая функция возвращает это struct
в качестве выхода.
function AllVariables = GlobalFunction(varargin);
% bunch of stuff
AllVariables= struct('Variable1', Variable1, 'Variable2', Variable2, …);
end