Установить рабочую область функции на базу в 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
Другие вопросы по тегам