exponenta event banner

Прозрачность кода MATLAB

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

В этих контекстах кодирования MATLAB требует прозрачного доступа к переменным:

В этих контекстах непрозрачный доступ к переменным приводит к ошибкам времени выполнения.

Запись прозрачного кода

Прозрачный код явно ссылается на имена переменных. Например, в этом коде MATLAB может идентифицировать X и ii в качестве переменных.

X = zeros(1,10);
for ii = 1:10
    X(ii) = randi(9,1);
end

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

X = zeros(1,10);
for ii = 1:10
    eval('X(ii) = randi(9,1);')
end

Перед выполнением этого кода MATLAB видит вызов eval функция с одним аргументом, который является символьным вектором 'X(ii) = randi(9,1);'.

Чтобы быть прозрачным, код должен явно ссылаться на имена переменных, чтобы MATLAB мог идентифицировать переменные путем проверки или статического анализа. Использование eval функция с символьным вектором 'X(ii) = randi(9,1);' означает, что MATLAB должен выполнить код для идентификации X и ii в качестве переменных.

Ниже приведен частичный список функций и кодов, которые нельзя использовать с прозрачным доступом к переменным:

  • eval, evalc, evalin, или assignin

  • Сценарии

  • Функции MEX, которые получают динамический доступ к переменным рабочей области, например, с помощью mexGetVariable

  • Интроспективные функции, такие как who и whos

  • save и load команды, за исключением тех случаев, когда результат load назначается явным образом

  • Любая ссылка на динамическое имя

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

clear X
clear('X')

Если код создает переменные рабочей области, но MATLAB может идентифицировать эти новые переменные только после выполнения кода, то этот код не имеет прозрачного доступа к переменным. Например, MATLAB не может определить, какие переменные загружаются из MAT-файла, поэтому эта инструкция не является прозрачной.

load foo.mat

Однако код, который явно назначает загруженную переменную имени, прозрачен, поскольку MATLAB может распознать, что имя в левой части ссылается на переменную рабочей области. Например, эта инструкция загружает переменную X из файла MAT в рабочую область в переменной с именем X.

X = load('foo.mat','X');

Доступ к переменным должен быть прозрачным в рабочей области. Например, код не может использовать evalin или assignin в рабочей области, требующей прозрачности для создания переменных в другой рабочей области.

Связанные темы