脚本在函数中运行出现令人费解的错误

时间:2014-10-16 19:23:46

标签: matlab

我在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

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

任何人都可以重现这个吗?这是怎么回事?

1 个答案:

答案 0 :(得分:5)

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

没有明确的页面讨论MATLAB如何在编译时解析名称,但Variables Names页面底部有一个小小的问题:“在某些情况下,load或{{1添加与函数具有相同名称的变量。除非这些变量在调用evalload之前位于函数工作空间中,否则MATLAB解析器会将变量名称解释为函数名称。

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

然后在运行时,即使名为myscript的变量已将 1 填充到函数的工作空间中,正在运行的解释代码仍具有dataset符号在dataset - 与类构造函数关联的语句中。

如果需要,您仍然可以使用if变量名称并从外部文件加载,但应通过函数调用进行显式赋值。例如:

dataset

现在解析器会注意到dataset = initialize(); 是函数dataset的任意输出,并且一切都会很好。事实上,如果您愿意,甚至可以initializeinitialize构造函数返回dataset变量。


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