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