eval函数的替代
为什么要避免使用eval函数?
虽然eval
函数非常强大和灵活,但它并不总是解决编程问题的最佳方案。代码调用eval
通常比使用其他函数或语言结构的代码效率更低,更难以阅读和调试。例如:
MATLAB®在第一次运行时编译代码,以增强未来运行时的性能。然而,由于代码在
eval
语句可以在运行时更改,它不会被编译。代码在一个
eval
语句可以意外地创建或赋值给当前工作区中已经存在的变量,从而覆盖现有数据。连接的字符向量
eval
声明通常很难读懂。其他语言结构可以简化代码中的语法。
的许多常用用法eval
,有首选的替代方法,如下面的示例所示。
具有顺序名称的变量
的频繁使用eval
函数是创建变量集,如A1
,A2
,...
,一个
,但该方法不使用MATLAB的阵列处理能力,不推荐使用。首选的方法是将相关数据存储在单个数组中。如果数据集的类型或大小不同,请使用结构或单元格数组。
例如,创建一个包含10个元素的单元格数组,其中每个元素都是数字数组:
numarray = 10;=细胞(numarray, 1);为n = 1:numArrays A{n} = magic(n);结束
通过用花括号进行索引来访问单元格数组中的数据。例如,显示的第五个元素一个
:
一个{5}
Ans = 17 24 18 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
的赋值语句{n} =魔法(n)
有比这更优雅和高效的呼唤吗eval
:
eval ([“一个”int2str (n),' =魔法(n) '])%不推荐
欲了解更多信息,请参见:
按顺序命名的文件
相关数据文件通常有一个带整数索引的公共根名称,例如myfile1.mat
通过myfileN.mat
.的常用(但不推荐)用法eval
函数是使用命令语法构造并将每个文件名传递给函数,例如
eval ([“拯救myfile”int2str (n),“.mat”])%不推荐
最佳实践是使用函数语法,它允许将变量作为输入传递。例如:
currentFile =“myfile1.mat”;保存(currentFile)
方法可以在循环中构造文件名sprintf
函数(它通常比int2str
),然后调用保存
函数没有eval
.这段代码在当前文件夹中创建了10个文件:
numFiles = 10;为n = 1:numFiles randomData = rand(n);currentFile = sprintf (“myfile % d.mat”n);保存(currentFile,“randomData”)结束
欲了解更多信息,请参见:
变量中的函数名
的常用用法eval
是在函数名在变量字符向量中时执行函数。有两种从变量求函数值的方法比使用更有效eval
:
变量中的字段名
通过将字段的表达式括在圆括号中,访问具有变量字段名的结构中的数据。例如:
myData。Height = [67,72,58];myData。重量= [140, 205, 90]; fieldName = input('选择数据(身高或体重):',“年代”);dataToUse = myData。(字段名);
如果你输入重量
在输入提示符处,您可以找到最小值重量
值,使用以下命令。
分钟(dataToUse)
ans = 90
有关其他示例,请参见从变量中生成字段名.
错误处理
在MATLAB中错误处理的首选方法是使用试,抓
声明。例如:
试一试B =一个;抓异常disp (一个是未定义的)结束
如果您的工作区不包含变量一个
,那么这个代码返回:
一个是未定义的
的文档的以前版本eval
函数包含语法catch_expr eval(表达)
.如果评估表达式
然后,Input返回一个错误eval
评估catch_expr
.然而,显式try / catch
比隐含的捕获要清楚得多eval
声明。不建议使用隐式捕获。