2014-10-16 45 views
1

我在Matlab R2012b中遇到了一个令人费解的错误。看起来也是数据类型的变量名称表现出奇怪的行为。请看到这个小例子:令人费解的错误,在函数中运行脚本

function [] = test1() 
dataset = 1; 

if dataset ~= 0 
    disp hello 
end 

end 

test1()调用产生输出hello,符合市场预期。 现在,我不是在我的函数中设置值dataset,而是运行脚本。

function [] = test2() 
myscript; 

if dataset ~= 0 
    disp hello 
end 

end 

其中myscript.m有句台词:

dataset=1; 

现在,当我打电话test2()我得到这个错误:

Undefined function 'ne' for input arguments of type 'dataset'. 
Error in test2 (line 4) 
if dataset ~= 0 

(原谅变量名为dataset - 我知道这是也是数据类型的名称,它出现在我正在运行的代码中。)因此,似乎在test2中,Matlab创建了一个空的dataset对象而不是使用名为dataset的变量。此外,只有当我在脚本中而不是在函数体中设置该值时,才会出现此行为。更奇怪的是,我可以这样做:

>> dbstop in test2 at 4 % line of if statement 
>> test2() 
K>> dataset 
dataset = 
     1.00 
K>> dataset ~= 0 
ans = 
1 
K>> if dataset ~= 0, disp hello; end 
hello 
K>> dbcont 

和我得到同样的错误!错误在调试模式下不显示,但正常执行。

任何人都可以重现吗?这里发生了什么?

+0

总之:问题在于'dataset'是一个函数,并且在没有输入参数的情况下运行它会构造一个数据集对象。如果你在你的函数中给它赋值,MATLAB会记住这一点。如果你在单独的脚本中这样做,MATLAB首先执行该功能。 – MeMyselfAndI 2014-10-16 19:30:03

+0

为什么Matlab记住函数中的赋值而不是单独的脚本?我认为运行一个脚本就像在其中的代码复制粘贴?此外,为什么然后整数值会出现在调试模式,但不是在正常执行? – 2014-10-16 19:34:48

+1

我不得不说,我现在没有所有的细节,但这与MATLAB中的解析顺序有关。 – MeMyselfAndI 2014-10-16 19:47:35

回答

5

MATLAB在线帮助有一些页面处理这个问题; Variables NamesLoading Variables within a Function似乎是最相关的。

有,讨论MATLAB是如何在编译时解析名称没有明确的页面,但在Variables Names页面底部的一个小花絮:“在某些情况下,loadeval添加具有相同的名称作为函数的变量。除非这些变量在调用loadeval前的功能工作区时,MATLAB解析器解释变量名函数名称。

换句话说,如果解析器发现到一个明确分配变量,其名称与另一个现有对象t相同他本地定义优先。 在您的test2()中,没有明确赋值给变量dataset;因此,在编译文件时,解析器将dataset解释为类构造函数(因为解析器不会运行或将myscript内联到函数中)。

然后在运行时,即使一个名为dataset变量已poofed 到函数的工作空间,仍在运行的解释代码具有与类构造函数相关的if语句来的dataset符号。

如果需要,仍然可以使用外部文件中的变量名和加载,但应该通过函数调用进行明确的分配。例如:

dataset = initialize(); 

现在解析器会注意到dataset是功能initialize的一些任意的输出和一切都会好的。实际上,如果需要,甚至可以让initialize将构造函数dataset返回到dataset变量。


当变量没有明确定义的分配,MATLAB人(至少在他们的一些博客,我读过)称这种“poofing”。使用load没有任何输出参数,使用eval,并且只是运行脚本(不是函数)可以将所有poof变量放入工作区。只要变量名在编译时不与其他正在使用的符号冲突,就可以正常工作。