我在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 :(得分:5)
MATLAB在线帮助有一些处理此问题的页面; Variables Names和Loading Variables within a Function似乎最相关。
没有明确的页面讨论MATLAB如何在编译时解析名称,但Variables Names页面底部有一个小小的问题:“在某些情况下,load
或{{1添加与函数具有相同名称的变量。除非这些变量在调用eval
或load
之前位于函数工作空间中,否则MATLAB解析器会将变量名称解释为函数名称。 “
换句话说,如果解析器找到对其名称与另一个现有对象相同的变量的显式赋值,则本地定义优先。
在eval
中,没有明确指定变量test2()
;因此,在编译文件时,解析器会将dataset
解释为类构造函数(因为解析器不会运行或内联dataset
到函数中)。
然后在运行时,即使名为myscript
的变量已将 1 填充到函数的工作空间中,正在运行的解释代码仍具有dataset
符号在dataset
- 与类构造函数关联的语句中。
如果需要,您仍然可以使用if
变量名称并从外部文件加载,但应通过函数调用进行显式赋值。例如:
dataset
现在解析器会注意到dataset = initialize();
是函数dataset
的任意输出,并且一切都会很好。事实上,如果您愿意,甚至可以initialize
将initialize
构造函数返回dataset
变量。
1 当变量定义没有明确赋值时,MATLAB人员(至少在我读过的一些博客上)称之为“poofing”。使用dataset
没有任何输出参数,使用load
,只需运行脚本(不是函数),就可以将所有变量变量放入工作区。只要变量名在编译时不与其他正在使用的符号冲突,这就可以正常工作。