令人费解的错误,在函数中运行脚本
我在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
和我得到同样的错误!错误在调试模式下不显示,但正常执行。
任何人都可以重现吗?这里发生了什么?
MATLAB在线帮助有一些页面处理这个问题; Variables Names和Loading Variables within a Function似乎是最相关的。
有,讨论MATLAB是如何在编译时解析名称没有明确的页面,但在Variables Names页面底部的一个小花絮:“在某些情况下,load
或eval
添加具有相同的名称作为函数的变量。除非这些变量在调用load
或eval
前的功能工作区时,MATLAB解析器解释变量名函数名称。“
换句话说,如果解析器发现到一个明确分配变量,其名称与另一个现有对象t相同他本地定义优先。 在您的test2()
中,没有明确赋值给变量dataset
;因此,在编译文件时,解析器将dataset
解释为类构造函数(因为解析器不会运行或将myscript
内联到函数中)。
然后在运行时,即使一个名为dataset
变量已poofed 到函数的工作空间,仍在运行的解释代码具有与类构造函数相关的if
语句来的dataset
符号。
如果需要,仍然可以使用外部文件中的变量名和加载,但应该通过函数调用进行明确的分配。例如:
dataset = initialize();
现在解析器会注意到dataset
是功能initialize
的一些任意的输出和一切都会好的。实际上,如果需要,甚至可以让initialize
将构造函数dataset
返回到dataset
变量。
当变量没有明确定义的分配,MATLAB人(至少在他们的一些博客,我读过)称这种“poofing”。使用load
没有任何输出参数,使用eval
,并且只是运行脚本(不是函数)可以将所有poof变量放入工作区。只要变量名在编译时不与其他正在使用的符号冲突,就可以正常工作。
总之:问题在于'dataset'是一个函数,并且在没有输入参数的情况下运行它会构造一个数据集对象。如果你在你的函数中给它赋值,MATLAB会记住这一点。如果你在单独的脚本中这样做,MATLAB首先执行该功能。 – MeMyselfAndI 2014-10-16 19:30:03
为什么Matlab记住函数中的赋值而不是单独的脚本?我认为运行一个脚本就像在其中的代码复制粘贴?此外,为什么然后整数值会出现在调试模式,但不是在正常执行? – 2014-10-16 19:34:48
我不得不说,我现在没有所有的细节,但这与MATLAB中的解析顺序有关。 – MeMyselfAndI 2014-10-16 19:47:35