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

Код имеет transparent variable access если 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 функции в рабочей области, которая требует, чтобы прозрачность создала переменные в другой рабочей области.

Похожие темы