Compartir datos entre áreas de trabajo
Introducción
Este tema muestra cómo compartir variables entre áreas de trabajo o permitir que se mantengan entre ejecuciones de funciones.
En la mayoría de los casos, las variables creadas dentro de una función son variables locales conocidas solo dentro de esa función. Las variables locales no están disponibles en la línea de comandos ni para ninguna otra función. Sin embargo, existen varias maneras de compartir datos entre funciones o áreas de trabajo.
Prácticas recomendadas: Paso de argumentos
La forma más segura de ampliar el ámbito de una variable de función es usar argumentos de entrada y salida de la función, que permiten pasar valores de variables.
Por ejemplo, cree dos funciones, update1
y update2
, que compartan y modifiquen un valor de entrada. update2
puede ser una función local en el archivo update1.m
, o una función en su propio archivo, update2.m
.
function y1 = update1(x1) y1 = 1 + update2(x1); function y2 = update2(x2) y2 = 2 * x2;
Llame a la función update1
desde la línea de comandos y asígnela a la variable Y
del área de trabajo básica:
X = [1,2,3]; Y = update1(X)
Y = 3 5 7
Funciones anidadas
Las funciones anidadas también tienen acceso a las áreas de trabajo de todas las funciones en las cuales están anidadas. Así, por ejemplo, una función anidada puede utilizar una variable (en este caso, x
) que esté definida en su función principal:
function primaryFx x = 1; nestedFx function nestedFx x = x + 1; end end
Cuando las funciones principales no utilizan una variable dada, la variable permanece local para la función anidada. Por ejemplo, en esta versión de primaryFx
, las dos funciones anidadas tienen sus propias versiones de x
que no pueden interactuar entre ellas.
function primaryFx nestedFx1 nestedFx2 function nestedFx1 x = 1; end function nestedFx2 x = 2; end end
Para obtener más información, consulte Funciones anidadas.
Variables persistentes
Cuando declara una variable dentro de una función como persistente, la variable conserva su valor de una llamada de función a la siguiente. Otras variables locales conservan su valor solo durante la ejecución actual de una función. Las variables persistentes son equivalentes a las variables estáticas de otros lenguajes de programación.
Declare variables usando la palabra clave persistent
antes de utilizarlas. MATLAB® inicializa las variables persistentes en una matriz vacía, []
.
Por ejemplo, defina una función en un archivo denominado findSum.m
que inicializa una suma de 0
y, a continuación, añade al valor en cada iteración.
function findSum(inputvalue) persistent SUM_X if isempty(SUM_X) SUM_X = 0; end SUM_X = SUM_X + inputvalue;
Cuando llama a la función, el valor de SUM_X
se mantiene entre las ejecuciones posteriores.
Las siguientes operaciones borran las variables persistentes de una función:
clear all
clear
functionname
Editar el archivo de la función
Para evitar que se borren las variables persistentes, bloquee el archivo de la función usando mlock
.
Variables globales
Las variables globales son variables a las que puede acceder desde las funciones o desde la línea de comandos. Tienen su propia área de trabajo, independiente de las áreas de trabajo básica y de función.
Sin embargo, las variables globales conllevan riesgos notables. Por ejemplo:
Cualquier función puede acceder a una variable global y actualizarla. Otras funciones que usen la variable podrían devolver resultados inesperados.
Si, involuntariamente, proporciona una "nueva" variable global el mismo nombre que una variable global existente, una función puede sobrescribir los valores esperados por otra. Este error es difícil de diagnosticar.
Utilice las variables globales con moderación, si es que tiene que hacerlo.
Si utiliza variables globales, declárelas usando la palabra clave global
antes de acceder a ellas dentro de cualquier ubicación concreta (función o línea de comandos). Por ejemplo, cree una función en un archivo denominado falling.m
:
function h = falling(t) global GRAVITY h = 1/2*GRAVITY*t.^2;
A continuación, introduzca estos comandos en la línea de comandos:
global GRAVITY
GRAVITY = 32;
y = falling((0:.1:5)');
Las dos instrucciones globales hacen que el valor asignado a GRAVITY
en la línea de comandos también esté disponible dentro de la función. Sin embargo, como alternativa más sólida, redefina la función para que acepte el valor como entrada:
function h = falling(t,gravity)
h = 1/2*gravity*t.^2;
A continuación, introduzca estos comandos en la línea de comandos:
GRAVITY = 32; y = falling((0:.1:5)',GRAVITY);
Evaluación en otras áreas de trabajo
Las funciones evalin
y assignin
permiten evaluar comandos o nombres de variables a partir de vectores de caracteres y especificar si utilizar el área de trabajo actual o el área de trabajo básica.
Como en el caso de las variables globales, estas funciones conllevan el riesgo de sobrescribir datos existentes. Utilícelas con moderación.
En ocasiones, evalin
y assignin
son útiles para funciones callback en interfaces gráficas de usuario con respecto a las que evaluar el área de trabajo básica. Por ejemplo, cree un cuadro de lista de nombres de variables del área de trabajo básica:
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;
Para otras aplicaciones de programación, considere el paso de argumentos y las técnicas descritas en Alternativas a la función eval.