Resolver el error: Attempt to Add Variable to a Static Workspace.
Problema
Las áreas de trabajo para funciones anidadas y anónimas son estáticas. Esto significa que todas las variables usadas dentro de la función deben estar presentes en el texto del código.
Si intenta añadir dinámicamente una variable al área de trabajo estática de una función anónima, una función anidada o una función que contiene una función anidada dinámicamente, MATLAB® emite un error del tipo
Attempt to add variable to a static workspace.
Para obtener más información sobre las diferencias entre las áreas de trabajo básica y de función, consulte Áreas de trabajo básica y de función. Para obtener más información acerca de las funciones anidadas, consulte Funciones anidadas.
Posibles soluciones
Declarar la variable por adelantado
Una manera de evitar añadir dinámicamente una variable en áreas de trabajo estáticas es declarar explícitamente la variable en el código antes de asignar dinámicamente un valor a esa variable. Haciéndolo, el nombre de la variable será visible para MATLAB, por lo que el nombre se incluirá en el conjunto fijo de variables que componen el área de trabajo estática.
Por ejemplo, suponga que un script llamado makeX.m
asigna dinámicamente un valor a la variable X
. Una función que llama a makeX
y declara explícitamente X
evita el error de adición dinámica porque X
está en el área de trabajo de la función.
Una forma habitual de declarar una variable es inicializar su valor en un arreglo vacío:
function noerror nestedfx function nestedfx X = []; makeX end end
Usar eval
, evalin
o assignin
para asignar nuevas variables a una función anidada
Usar eval
, evalin
o assignin
para asignar nuevas variables dentro de funciones anidadas generará un error.
function staticWorkspaceErrors function nest % This will error since x is not declared outside of the eval eval("x=2"); end end
En la medida de lo posible, evite estas funciones. Consulte Alternativas a la función eval. Si no puede evitarlas, declare explícitamente la variable dentro de la función principal:
function noStaticWorkspaceErrors x = []; function nest % This will not error since 'x' is declared outside of the eval eval("x=2"); end end
Usar un script de MATLAB para asignar nuevas variables en una función anidada
Llamar a un script de MATLAB que crea una variable dentro de una función anidada generará un error. En el siguiente ejemplo, el script scriptThatIntroducesZ
contiene código que asigna un valor a la variable z
. Dado que el código no declara explícitamente que z
se está asignando, se producirá un error.
function staticWorkspaceErrors function nest % This will error since 'z' is not declared outside of this script scriptThatIntroducesZ end end
Para evitar que se produzca un error, declare la variable dentro de la función antes de llamar al script que le asigna un valor.
function noStaticWorkspaceErrors function nest % This will not error since 'z' is declared outside of the script z = []; scriptThatIntroducesZ end end
De forma alternativa, convierta el script a una función con un argumento de salida z
. Este enfoque también hace que el código sea más claro.
Usar un nombre de variable explícito con la función load
Usar load
para asignar variables dentro de funciones anidadas sin especificar explícitamente el nombre de la variable generará un error. En el siguiente ejemplo, load
se usa para cargar un archivo MAT que contiene la variable Y
. Dado que el código no declara explícitamente que Y
se está asignando, se producirá un error.
function staticWorkspaceErrors function nest % This will error since var Y is not explicitly specified load MatFileWithVarY end end
Para evitar que se produzca un error, especifique en su lugar el nombre de la variable como entrada de la función load
.
function noStaticWorkspaceErrors function nest % This will not error since variables 'x' and 'y' are specified load MatFileWithVarX x y = load('MatFileWithVarY','y'); end end
De forma alternativa, asigne la salida de la función load
a un arreglo de estructuras.
Asignar una variable en el depurador de MATLAB en una función anidada
Durante la depuración, no puede añadir una variable desde la línea de comandos de depuración si se detiene en una función anidada. Asigne la variable al área de trabajo básica, que no es estática.
K>> assignin('base','X',myvalue)
Asignar una variable en una función anónima
Las funciones anónimas no pueden contener asignaciones de variables. Cuando se llame a la función anónima, se producirá un error.
% This will error since 'x' is being assigned inside % the anonymous function @()eval("x=2")
Reescriba la función de forma que no sea necesario asignar variables.
xEquals2 = @()2; x = xEquals2()
x = 2