Осуществляйте обмен данными между рабочими областями

Введение

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

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

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

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

Например, создайте две функции, update1 и update2, ту долю и измените входное значение. update2 может быть локальной функцией в файле update1.m или может быть функцией в ее собственном файле, update2.m 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 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;

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

Похожие темы

Была ли эта тема полезной?