eval 使用理解


eval

执行文本中的 MATLAB 表达式

全页折叠

语法

eval(expression)
[output1,...,outputN] = eval(expression)

说明

eval(expression) 计算 expression 表示的代码 MATLAB®。如果在匿名函数、嵌套函数或含有嵌套函数的函数中使用 eval,则已计算的 expression 无法创建变量。

[output1,...,outputN] = eval(expression) 将 expression 的输出存储在指定的变量中。

输入参数

expression

包含有效 MATLAB 表达式的字符向量字符串标量

要在表达式中包含数值,请将其转换为字符向量或字符串标量。

字符向量,例如‘a’;

字符串标量,例如,“a='c_d';”     复杂的表达式可以使用字符串形式方便的书写;

字符串标量只有一个字符串元素,用双引号;形如["firststring", "secondstring"]是字符串数组,不是字符串标量;

 

输出参数

output1,...,outputN

expression 的计算输出。

示例

全部折叠

变量名计算

选择一个要在运行时绘制的矩阵。

本示例要求在当前工作区中有一个矩阵。例如:

aMatrix = magic(5);

以交互方式请求要绘制的矩阵的名称,然后调用 eval 来使用它的值。

expression = input('Enter the name of a matrix: ','s');
if (exist(expression,'var'))
    mesh(eval(expression))
end

如果在输入提示符处键入 aMatrix,则下面的代码创建 magic(5) 的网格图。

提示

  • eval 函数的许多常见用法的效率不如其他 MATLAB 函数和语言构造高效,更难阅读和调试。有关详细信息,请参阅eval 函数的替代方法

  • 尽可能不在 eval 函数的输入中包含输出参数,例如 eval(['output = ',expression])。首选语法,

      output = eval(expression)

    允许 MATLAB 解析器对代码执行更严格的检查,防止捕捉不到的错误和其他意外行为。

 

 

%%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

eval 函数的替代方法

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

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

  • MATLAB® 会在您首次运行代码时对代码进行编译,以增强以后运行的性能。但是,由于 eval 语句中的代码可在运行时更改,因此无法进行编译。

  • eval 语句中的代码可能会意外创建变量或为当前工作区中已存在的变量赋值,并覆盖现有的数据。

  • eval 语句中的串联字符向量通常难以阅读。其他语言构造方式可以简化您代码中的语法。

对于 eval 的许多常见用法,有一些首选的替代方法,下面以示例形式介绍了这些方法。

带有序列名称的变量

eval 函数的常见用法是创建 A1A2...An 之类的变量集,但此方法不使用 MATLAB 的数组处理功能,因此建议不要使用。首选方法是将相关数据存储在单个数组中。如果数据集具有不同的类型或大小,请使用结构体或元胞数组。

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

numArrays = 10;
A = cell(numArrays,1);
for n = 1:numArrays
    A{n} = magic(n);
end

通过花括号创建索引来访问元胞数组中的数据。例如,显示 A 的第五个元素:

A{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

赋值语句 A{n} = magic(n) 要比下面调用 eval 的语法更为简洁高效:

eval(['A', int2str(n),' = magic(n)'])     % Not recommended

有关详细信息,请参阅:

带有序列名称的文件

相互关联的数据文件通常具有一个共同的带整数索引的根名称,例如 myfile1.mat 到 myfileN.mateval 函数的一个常见(但不建议)用法是使用命令语法构造每个文件名并将它们传递给某个函数,例如

eval(['save myfile',int2str(n),'.mat'])     % Not recommended

最佳做法是使用函数语法,该语法允许您将变量作为输入传递。例如:

currentFile = 'myfile1.mat';
save(currentFile)

您可以使用 sprintf 函数(通常比 int2str 更有效)在循环内构造文件名,然后调用 save 函数,而无需使用 eval。此代码在当前文件夹中创建 10 个文件:

numFiles = 10;
for n = 1:numFiles
   randomData = rand(n);
   currentFile = sprintf('myfile%d.mat',n);
   save(currentFile,'randomData')
end

有关详细信息,请参阅:

变量中的函数名称

eval 的一个常见用法是当函数的名称位于可变字符向量中时执行函数。有两种方式可计算变量中的函数,每一种都比使用 eval 更为高效:

  • 使用 @ 符号或使用 str2func 函数创建函数句柄。例如,从元胞数组中存储的列表运行函数:

    examples = {@odedemo,@sunspots,@fitdemo};
    n = input('Select an example (1, 2, or 3): ');
    examples{n}()
  • 使用 feval 函数。例如,使用您在运行时指定的数据调用绘图函数(例如 plotbar 或 pie):

    plotFunction = input('Specify a plotting function: ','s');
    data = input('Enter data to plot: ');
    feval(plotFunction,data)

变量中的字段名称

通过将字段表达式括入括号中,使用变量字段名称访问结构体中的数据。例如:

myData.height = [67, 72, 58];
myData.weight = [140, 205, 90];

fieldName = input('Select data (height or weight): ','s');
dataToUse = myData.(fieldName);

如果您在输入提示符处输入 weight,则可以使用以下命令查找最小 weight 值。

min(dataToUse)
ans =
    90

有关其他示例,请参阅基于变量生成字段名称

错误的处理方式

MATLAB 中处理错误的首选方法是使用 try, catch 语句。例如:

try
   B = A;
catch exception
   disp('A is undefined')
end

如果您的工作区不包含变量 A,则该代码返回:

A is undefined

eval 函数以前版本的文档中包含 eval(expression,catch_expr) 语法介绍。如果计算 expression 输入返回错误,则 eval 会计算 catch_expr。但是,在 eval 语句中,显式的 try/catch 明显比隐式的 catch 更清晰。建议不要使用隐式的 catch。

参考

https://ww2.mathworks.cn/help/matlab/ref/eval.html

https://ww2.mathworks.cn/help/matlab/matlab_prog/string-evaluation.html

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值