主要内容

eval函数的替代

为什么要避免使用eval函数?

虽然eval函数非常强大和灵活,但它并不总是解决编程问题的最佳方案。代码调用eval通常比使用其他函数或语言结构的代码效率更低,更难以阅读和调试。例如:

  • MATLAB®在第一次运行时编译代码,以增强未来运行时的性能。然而,由于代码在eval语句可以在运行时更改,它不会被编译。

  • 代码在一个eval语句可以意外地创建或赋值给当前工作区中已经存在的变量,从而覆盖现有数据。

  • 连接的字符向量eval声明通常很难读懂。其他语言结构可以简化代码中的语法。

的许多常用用法eval,有首选的替代方法,如下面的示例所示。

具有顺序名称的变量

的频繁使用eval函数是创建变量集,如A1A2...一个,但该方法不使用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

  • 方法创建函数句柄@符号或与str2func函数。例如,从存储在单元格数组中的列表中运行一个函数:

    示例= {@odedemo, @sunspots @fitdemo};n =输入(“选择一个例子(1、2或3):”);例子{n} ()
  • 使用函数宏指令函数。例如,调用一个plot函数(例如情节酒吧,或)与您在运行时指定的数据:

    plotFunction =输入('指定绘图函数:'“年代”);data =输入(“输入数据绘图:”);函数宏指令(plotFunction、数据)

变量中的字段名

通过将字段的表达式括在圆括号中,访问具有变量字段名的结构中的数据。例如:

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声明。不建议使用隐式捕获。

Baidu
map