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