我在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)
我得到了同样的错误!在调试模式下不会显示错误,但它正常执行.
任何人都可以重现这个吗?这里发生了什么?
MATLAB在线帮助有一些页面处理这个问题; 函数中的变量名称和加载变量似乎是最相关的.
没有明确的页面讨论MATLAB如何在编译时解析名称,但在Variables Names页面的底部有一个小小的问题:"在某些情况下,load或eval添加与函数具有相同名称的变量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和简单地运行脚本(不是函数)都可以将所有变量变量放入工作空间.只要变量名在编译时不与其他正在使用的符号冲突,这就可以正常工作.