exponenta event banner

Совместное использование данных между рабочими пространствами

Введение

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

В большинстве случаев переменные, созданные внутри функции, являются локальными переменными, известными только внутри этой функции. Локальные переменные недоступны в командной строке или для других функций. Однако существует несколько способов совместного использования данных между функциями или рабочими областями.

Передовая практика: передача аргументов

Наиболее безопасным способом расширения области действия переменной функции является использование входных и выходных аргументов функции, которые позволяют передавать значения переменных.

Например, создайте две функции, update1 и update2, которые совместно используют и изменяют входное значение. update2 может быть локальной функцией в файле update1.m, или может быть функцией в собственном файле, update2.m.

function y1 = update1(x1)
   y1 = 1 + update2(x1);

function y2 = update2(x2)
   y2 = 2 * x2;

Позвоните в update1 функция из командной строки и назначение переменной Y в базовом рабочем пространстве:

X = [1,2,3];
Y = update1(X)
Y =
     3     5     7

Вложенные функции

Вложенная функция имеет доступ к рабочим пространствам всех функций, в которые она вложена. Так, например, вложенная функция может использовать переменную (в данном случае, x), которая определена в родительской функции:

function primaryFx
   x = 1;
   nestedFx

   function nestedFx
      x = x + 1;
   end
end

Если родительские функции не используют заданную переменную, переменная остается локальной для вложенной функции. Например, в этой версии primaryFx, две вложенные функции имеют свои собственные версии x которые не могут взаимодействовать друг с другом.

function primaryFx
   nestedFx1
   nestedFx2

   function nestedFx1
      x = 1;
   end

   function nestedFx2
      x = 2;
   end
end

Дополнительные сведения см. в разделе Вложенные функции.

Постоянные переменные

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

Объявить переменные с помощью persistent ключевое слово перед их использованием. MATLAB ® инициализирует постоянные переменные в пустую матрицу ,[].

Например, определите функцию в файле с именем findSum.m инициализирует сумму для 0, а затем добавляет значение для каждой итерации.

function findSum(inputvalue)
persistent SUM_X

if isempty(SUM_X)
   SUM_X = 0;
end
SUM_X = SUM_X + inputvalue;

При вызове функции значение SUM_X сохраняется между последующими казнями.

Эти операции очищают постоянные переменные для функции:

  • clear all

  • clear functionname

  • Редактирование файла функции

Чтобы предотвратить удаление постоянных переменных, заблокируйте файл функции с помощью mlock.

Глобальные переменные

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

Однако глобальные переменные сопряжены с заметными рисками. Например:

  • Любая функция может обращаться к глобальной переменной и обновлять ее. Другие функции, использующие переменную, могут возвращать неожиданные результаты.

  • При непреднамеренном присвоении «новой» глобальной переменной имени, совпадающего с именем существующей глобальной переменной, одна функция может перезаписать значения, ожидаемые другой. Эту ошибку трудно диагностировать.

Используйте глобальные переменные скудно, если вообще.

Если используются глобальные переменные, объявите их с помощью global ключевое слово, прежде чем обращаться к ним в каком-либо определенном расположении (функция или командная строка). Например, создайте функцию в файле с именем falling.m:

function h = falling(t)
   global GRAVITY
   h = 1/2*GRAVITY*t.^2;

Затем по запросу введите следующие команды:

global GRAVITY
GRAVITY = 32;
y = falling((0:.1:5)');

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

function h = falling(t,gravity)
   h = 1/2*gravity*t.^2;

Затем по запросу введите следующие команды:

GRAVITY = 32;
y = falling((0:.1:5)',GRAVITY);

Оценка в другой рабочей области

evalin и assignin функции позволяют вычислять команды или имена переменных по векторам символов и указывать, следует ли использовать текущее или базовое рабочее пространство.

Как и глобальные переменные, эти функции несут риски перезаписи существующих данных. Используйте их скудно.

evalin и assignin Иногда их полезно использовать для функций обратного вызова в графических интерфейсах пользователя для оценки по отношению к базовой рабочей области. Например, создайте список имен переменных из базового рабочего пространства:

function listBox
figure
lb = uicontrol('Style','listbox','Position',[10 10 100 100],...
              'Callback',@update_listBox);
update_listBox(lb)

function update_listBox(src,~)
vars = evalin('base','who');
src.String = vars;

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

Связанные темы