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

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

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

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

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

Прозрачный код явно ссылается на имена переменных. Для примера в этом коде 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 как переменные.

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

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

Похожие темы