Main Content

MATLAB 代码中的透明

如果 MATLAB® 可以在忽略注释、字符向量和字符串字面值的情况下,通过扫描代码来识别每个变量访问,则代码的变量访问是透明的。变量访问包括读取、添加、删除或修改工作区变量。

在以下编码环境中,MATLAB 需要透明的变量访问:

在这些上下文中,不透明的变量访问会导致运行时错误。

编写透明代码

透明代码显式引用变量名称。例如,在以下代码中,MATLAB 可以将 Xii 识别为变量。

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 必须执行代码以将 Xii 识别为变量。

以下列出了一部分不能采用透明变量访问的函数和编码:

使用命令形式将变量传递给函数是不透明的,因为这等效于将参量作为字符串传递。例如,对 clear 函数的以下调用均为不透明的。

clear X
clear('X')

如果代码创建工作区变量,但 MATLAB 只有在执行代码后才能识别这些新变量,则该代码的变量访问不透明。例如,以下语句是不透明的,因为 MATLAB 无法确定从 MAT 文件中加载了哪些变量。

load foo.mat

然而,将加载的变量显式赋给名称的代码是透明的,因为 MATLAB 可以识别左侧的名称引用了一个工作区变量。例如,以下语句将变量 X 从 MAT 文件加载到工作区中名为 X 的变量中。

X = load('foo.mat','X');

对变量的访问在工作区中必须是透明的。例如,代码无法在要求透明代码的工作区中使用 evalinassignin 函数在另一个工作区中创建变量。

相关主题