替代的eval函数

为什么要避免eval函数?

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

  • MATLAB®在第一次运行时编译代码,以提高以后运行时的性能。但是,由于代码在eval语句可以在运行时改变,它没有被编译。

  • 代码在一个eval语句可能会意外地创建或指定当前工作空间中已经存在的变量,从而覆盖现有数据。

  • 内的级联字符向量eval陈述句通常很难读懂。其他语言结构可以简化代码中的语法。

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

名称顺序的变量

经常使用的eval函数的作用是创建一组变量,如A1,A2,,一个,但是这种方法没有使用MATLAB的阵列处理能力,不推荐使用。首选的方法是将相关数据存储在单个数组中。如果数据集的类型或大小不同,则使用结构或单元格数组。

例如,创建一个包含10个元素的单元格数组,其中每个元素是一个数值数组:

numarray = 10;=细胞(numarray, 1);numArrays A{n} = magic(n);结束

通过花括号索引来访问单元格数组中的数据。例如,显示的第5个元素一个:

一个{5}
ANS = 17 24 1 8 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,@黑子,@ fitdemo};N =输入('选择一个示例(1、2或3):');例子{n} ()
  • 使用feval函数。例如,调用一个绘图函数(例如情节,酒吧,或馅饼)与您在运行时指定的数据:

    plotFunction =输入('指定一个绘图函数:',“年代”);data =输入(“输入数据以绘制:”);feval(plotFunction,数据)

字段名变量

由包围表达为括号中的字段中具有可变字段名称的结构访问数据。例如:

myData。height = [67, 72, 58];myData。重量= [140, 205, 90]; fieldName = input(“选择数据(身高或体重):”,“年代”);dataToUse = myData。(字段名);

如果你输入重量在输入提示,那么你就可以找到最低重量值,使用下面的命令。

分钟(dataToUse)
ans = 90

有关其他示例,请参见从变量中生成字段名

错误处理

在MATLAB错误处理的优选方法是使用试,抓声明。例如:

尝试B = A;异常disp (一个是未定义的)结束

如果您的工作区不包含变量一个,那么这个代码返回:

一个是未定义的

以前版本的文档eval函数包含语法catch_expr eval(表达)。如果评估表达式输入返回一个错误,然后eval评估catch_expr。然而,显式try / catch比?中的隐式捕获明显更清楚eval声明。不推荐使用隐式捕捞。