当从.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。
答案 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')
定义)。这对诊断您的问题有很大的影响。由于函数的范围不同,无法通过将内容复制/粘贴到命令窗口来测试函数。