MATLAB 代码中的透明
如果 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
识别为变量。
以下列出了一部分不能采用透明变量访问的函数和编码:
使用命令形式将变量传递给函数是不透明的,因为这等效于将参量作为字符串传递。例如,对 clear
函数的以下调用均为不透明的。
clear X clear('X')
如果代码创建工作区变量,但 MATLAB 只有在执行代码后才能识别这些新变量,则该代码的变量访问不透明。例如,以下语句是不透明的,因为 MATLAB 无法确定从 MAT 文件中加载了哪些变量。
load foo.mat
然而,将加载的变量显式赋给名称的代码是透明的,因为 MATLAB 可以识别左侧的名称引用了一个工作区变量。例如,以下语句将变量 X
从 MAT 文件加载到工作区中名为 X
的变量中。
X = load('foo.mat','X');
对变量的访问在工作区中必须是透明的。例如,代码无法在要求透明代码的工作区中使用 evalin
或 assignin
函数在另一个工作区中创建变量。