Matlab函数由于以下原因而失败:'使用Eval时出错',在命令窗口中使用时工作正常

时间:2016-05-25 01:21:59

标签: matlab plot

当从.mat文件中绘制数据时,如果我逐个从脚本中输入行,它可以正常工作......但是当我尝试运行脚本时,它会失败。

function Test (filename)  

   varname = load (filename)  %or load filename                                                     
   matObj = matfile(filename);
   varlist = who (matObj);   %or varlist = fieldnames (varname)  
   field1 = eval ( varlist {1} )
   field2 = eval ( varlist {2} )
   x1 = field1.x_values.start_value:field1.x_values.increment:field1.x_values.increment*field1.x_values.number_of_values;
   x2 = field2.x_values.start_value:field2.x_values.increment:field2.x_values.increment*field2.x_values.number_of_values;
   figure
   hold all

   %Support for yyaxis left/right not avaiable, so use plotyy
   plotyy (x1, field1.y_values.values, x2, field2.y_values.values)

end

当我调用脚本(Test('1.mat'))时,Matlab在field1 = line上显示错误:

  Error using eval
  Undefined function or variable 'Signal'.  

'Signal'是1.mat文件中的数据集名称之一。

有趣的是,当我从命令窗口以相同的顺序自行运行每一行时,我没有收到任何错误,并且显示了图表。我验证了当前路径有脚本和1.mat文件,但我无法弄清楚为什么它从脚本运行时抱怨eval。

1 个答案:

答案 0 :(得分:2)

问题是因为您的matObj*.mat文件,其中包含名为Signal的变量。您永远不会在函数中加载文件(使用load),而是将matfile object分配给matObj。要从此中读取变量,请不要使用eval永远,而只是想将dynamic fields referencing用于matfile对象

field1 = matObj.(varlist{1});
field2 = matObj.(varlist{2});

一般情况下,您应该知道您尝试从文件加载的变量的名称,而不是简单地使用who找到的前两个变量。如果是这种情况,请直接使用它们。

field1 = matObj.Signal;

您的代码可能在命令窗口中工作的原因是因为在某些时候您可能使用load将.mat文件加载到命令窗口工作区中,这将填充其所有内容(包括{{1} })进入工作区。

Signal

同样有点挑剔。您没有功能的脚本(顶部有load('filename.mat') 定义)。这对诊断您的问题有很大的影响。由于函数的范围不同,无法通过将内容复制/粘贴到命令窗口来测试函数