Эта тема показывает, как совместно использовать переменные между рабочими областями или позволить им сохраняться между функциональным выполнением.
В большинстве случаев переменные, созданные в функции, являются локальными переменными, известными только в этой функции. Локальные переменные не доступны в командной строке или ни к какой другой функции. Однако существует несколько способов осуществлять обмен данными между функциями или рабочими областями.
Самый безопасный способ расширить осциллограф функциональной переменной состоит в том, чтобы использовать входной параметр функции и выходные аргументы, которые позволяют вам передавать значения переменных.
Например, создайте две функции, 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;
Для других приложений программирования считайте передачу параметров и методы описанными в Альтернативных вариантах функции eval.