我的文件 testtest.m 如下所示:
pluse(1, 2)
function retval = pluse(input1, input2)
retval = input1 + input2;
endfunction
然后我得到:
error: 'pluse' undefined near line 1 column 1
error: called from
testtest at line 1 column 1
为什么我会收到此错误?
为了正确回答你的问题,我需要指出两点:
在 Octave 和 Matlab 中创建函数的规范方法是将其放置在同名的专用文件中,并以函数声明。其推论是,路径中以函数声明开头的任何文件都会在启动时被检测到,并作为可调用函数提供给用户。
Octave 多年来一直支持“on-the-go”函数定义(实际上还支持随后将此类“on-the-go”函数“导出”到文件); matlab 最近才包含“on-the-go”功能(我相信是 2016b?),并且选择以与 Octave 略有不同的方式实现此功能(大概是为了保持 Octave 的警惕?:p)
Octave 的实现实际上直接遵循该语言的规则。任何以以下语句开头的文件isn't“函数声明”被视为脚本,即一系列独立语句。因此无害的1
在脚本的开头,它是一个简单的“非函数声明”语句,但实际上它可以是任何东西。然后,脚本可以根据需要拥有任意数量的“即时”函数定义。对于在“on-the-go”上下文中使用函数的语句,显然需要首先定义该函数。这遵循以下基本原则:与函数相比,脚本有效地表示一组简单的语句,这些语句按顺序运行,无需任何预处理,并且人们可以简单地将这些命令复制/粘贴到它们的脚本中或从它们的脚本中复制/粘贴。终端并期望它们运行。
Matlab 最近的实现有效地打破了这种功能/范式。要明白我的意思,请将上面的代码复制粘贴到新的终端中(或突出显示然后按 F9)并观察它的崩溃。脚本不再可复制/粘贴,但假设 matlab 将预读并加载任何函数定义first, and then返回并尝试运行剩余的命令;换句话说,Matlab 现在对待脚本就像对待它的函数一样。请注意,matlab 仍然需要一个以非函数声明语句开头的脚本,因此实际上该位与需要以“1”开头的八度音程相同。唯一改变的是这种预先加载“on-the-go”函数的前瞻行为,我认为这在脚本上下文中不一定是一件好事。
我认为 Octave 的方法更有意义,尽管您在(无意中)将脚本视为有效而不是脚本时指出了 matlab 的便利性。哪一个一开始就不应该做。如果您需要前瞻功能和嵌套,您确实应该编写一个适当的函数并首先提供相关的作用域上下文。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)