Код имеет прозрачный доступ к переменной, если MATLAB ® может идентифицировать каждый доступ к переменной путем сканирования кода при игнорировании комментариев, векторов символов и строковых литералов. Доступ к переменной включает чтение, добавление, удаление или изменение переменных рабочей области .
В этих контекстах кодирования MATLAB требует прозрачного доступа к переменным:
Блоки проверки аргументов функции. Дополнительные сведения см. в разделе Ограничения доступа к переменным и функциям
Тело parfor цикл или spmd блок. Дополнительные сведения см. в разделе Обеспечение прозрачности в пакетных циклах или инструкциях spmd (панель инструментов параллельных вычислений).
В этих контекстах непрозрачный доступ к переменным приводит к ошибкам времени выполнения.
Прозрачный код явно ссылается на имена переменных. Например, в этом коде 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 в качестве переменных.
Ниже приведен частичный список функций и кодов, которые нельзя использовать с прозрачным доступом к переменным:
Сценарии
Функции MEX, которые получают динамический доступ к переменным рабочей области, например, с помощью mexGetVariable
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 в рабочей области, требующей прозрачности для создания переменных в другой рабочей области.