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

Mic*_*ith 1 matlab

我在Matlab R2012b中遇到了一个令人费解的错误.似乎也是数据类型的变量名称表现出奇怪的行为.请看这个小例子:

function [] = test1()
dataset = 1;

if dataset ~= 0
  disp hello
end

end
Run Code Online (Sandbox Code Playgroud)

正如预期的那样test1()产生输出的调用hello.现在,dataset我不是在我的函数中设置值,而是运行一个脚本.

function [] = test2()
myscript;

if dataset ~= 0
  disp hello
end

end
Run Code Online (Sandbox Code Playgroud)

myscript.m一条有一条线:

dataset=1;
Run Code Online (Sandbox Code Playgroud)

现在,当我打电话时,test2()我收到此错误:

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

(原谅名为变量的变量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
Run Code Online (Sandbox Code Playgroud)

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

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

Tro*_*kin 5

MATLAB在线帮助有一些页面处理这个问题; 函数中的变量名称加载变量似乎是最相关的.

没有明确的页面讨论MATLAB如何在编译时解析名称,但在Variables Names页面的底部有一个小小的问题:"在某些情况下,loadeval添加与函数具有相同名称的变量loadeval.除非这些变量是在调用or 之前的函数工作空间中,MATLAB解析器将变量名解释为函数名. "

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

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

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

dataset = initialize();
Run Code Online (Sandbox Code Playgroud)

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


1当没有明确赋值的情况下定义变量时,MATLAB人员(至少在我读过的一些博客上)称之为"poofing".使用load没有任何输出参数,使用eval和简单地运行脚本(不是函数)都可以将所有变量变量放入工作空间.只要变量名在编译时不与其他正在使用的符号冲突,这就可以正常工作.