Ошибка твердости: попытайтесь добавить переменную в статическую рабочую область.

Проблема

Рабочие области для вложенных и анонимных функций являются статическими. Это означает, что все переменные, используемые в функции, должны присутствовать в тексте кода.

При попытке динамически добавить переменную в статическую рабочую область анонимной функции, вложенной функции или функции, которая содержит вложенную функцию, то MATLAB® выдает ошибку формы

Attempt to add variable to a static workspace. 

Для получения дополнительной информации о различиях между основными и функциональными рабочими областями, смотрите Основные и Функциональные Рабочие области. Для получения дополнительной информации о вложенных функциях, смотрите Вложенные функции.

Возможные решения

Объявите переменную заранее

Один способ постараться не динамически добавлять переменную в статические рабочие области состоит в том, чтобы явным образом объявить переменную в коде прежде динамически присвоить значение той переменной. Выполнение так заставит имя переменной отображаться к MATLAB, таким образом, имя будет включено в фиксированный набор переменных, которые составляют статическую рабочую область.

Например, предположите скрипт под названием makeX.m динамически присваивает значение переменной X. Функция, которая вызывает makeX и явным образом объявляет X избегает динамической ошибки добавления потому что X находится в функциональной рабочей области.

Распространенный способ объявить переменную состоит в том, чтобы инициализировать свое значение как пустой массив:

function noerror

nestedfx

    function nestedfx
        X = [];
        makeX
    end
end

Используя evalevalin, или assignin присваивать новые переменные во вложенной функции

Используя evalevalin, или assignin чтобы присвоить новые переменные в, вложенные функции сгенерируют ошибку.

function staticWorkspaceErrors
    function nest
    % This will error since x is not declared outside of the eval
        eval("x=2"); 
    end
end

Если возможно, избегайте этих функций в целом. См. Альтернативные варианты функции eval. Если не возможно избежать их, то явным образом объявляют переменную в родительской функции:

function noStaticWorkspaceErrors
    x = [];
    function nest
    % This will not error since 'x' is declared outside of the eval
        eval("x=2");
    end
end

Используя скрипт MATLAB, чтобы Присвоить Новые Переменные Во Вложенной функции

Вызов скрипта MATLAB, который создает переменную во вложенной функции, сгенерирует ошибку. В примере ниже, скрипт, scriptThatIntroducesZ, содержит код, который присваивает значение переменной z. Поскольку код явным образом не объявляет тот z присваивается ошибка будет выдана.

function staticWorkspaceErrors
    function nest
    % This will error since 'z' is not declared outside of this script
        scriptThatIntroducesZ 
    end
end

Чтобы избежать ошибки, объявите переменную в функции прежде, чем вызвать скрипт, который присваивает значение ему.

function noStaticWorkspaceErrors
    function nest
    % This will not error since 'z' is declared outside of the script
        z = [];
        scriptThatIntroducesZ
    end
end

В качестве альтернативы преобразуйте скрипт в функцию и сделайте z это - выходной аргумент. Этот подход также делает код более ясным.

Используйте явное имя переменной с load Функция

Используя load присваивать переменные во вложенной функции, явным образом не задавая имя переменной сгенерирует ошибку. В примере ниже, load используется, чтобы загрузить MAT-файл, содержащий переменную Y. Поскольку код явным образом не объявляет тот Y присваивается ошибка будет выдана.

function staticWorkspaceErrors
    function nest
        % This will error since var Y is not explicitly specified
        load MatFileWithVarY 
    end
end

Чтобы избежать ошибки, вместо этого задайте имя переменной как вход к 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

В качестве альтернативы присвойте выход от load функционируйте к массиву структур.

Присвоение переменной в отладчике MATLAB во вложенной функции

При отладке вы не можете добавить переменную с помощью подсказки команды отладки, если вы останавливаетесь во вложенной функции. Присвойте переменную в базовое рабочее пространство, которое не является статическим.

K>> assignin('base','X',myvalue)

Присвоение переменной в анонимные функции

Анонимные функции не могут содержать переменные присвоения. Когда анонимная функция будет вызвана, ошибка будет выдана.

% This will error since 'x' is being assigned inside 
% the anonymous function
@()eval("x=2")

Перепишите функцию таким способом, которым не требуются переменные присвоения.

xEquals2 = @()2;
x = xEquals2()
x =

     2

Похожие темы