Код имеет transparent variable access, если MATLAB® может идентифицировать каждый переменный доступ путем сканирования кода при игнорировании комментариев, векторов символов и строковых литералов. Переменный доступ включает чтение, добавление, удаление или изменение переменных рабочей области.
В этих контекстах кодирования MATLAB требует прозрачного переменного доступа:
Блоки валидации аргумента функции. Для получения дополнительной информации смотрите Ограничения на Переменный и Функциональный доступ
Тело 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
функция, 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
функции в рабочей области, которая требует, чтобы прозрачность создала переменные в другой рабочей области.