Код имеет transparent variable access, если MATLAB® может идентифицировать каждый доступ переменной путем сканирования кода, игнорируя комментарии, векторы символов и строковые литералы. Доступ к переменной включает чтение, добавление, удаление или изменение переменных рабочей области.
В этих контекстах кодирования MATLAB требует прозрачного переменного доступа:
Блоки валидации аргументов функции. Для получения дополнительной информации смотрите Ограничения на переменную и Доступ к функции
Тело a parfor
цикл или spmd
блок. Для получения дополнительной информации смотрите Обеспечение прозрачности в циклы parfor или операторах spmd (Parallel Computing Toolbox).
В этих контекстах непрозрачный доступ к переменной приводит к ошибкам времени выполнения.
Прозрачный код явно ссылается на имена переменных. Для примера в этом коде MATLAB может идентифицировать X
и ii
как переменные.
X = zeros(1,10); for ii = 1:10 X(ii) = randi(9,1); end
Однако при следующем вызове eval
function, 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
функции в рабочей области, которая требует прозрачности для создания переменных в другой рабочей области.