我的文件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
为什么会出现此错误?
最佳答案
为了正确回答您的问题,我需要指出两点:
在倍频程和matlab中创建函数的规范方法是将其放置在具有相同名称的专用文件中,并使用函数声明启动文件。必然的结果是,在启动时会检测到路径中以函数声明开头的任何文件,并将其作为可调用函数提供给用户。
Octave支持“移动”功能定义已有很多年了(事实上,它还支持将这种“移动”功能随后“导出”到文件中); matlab最近才包含“ on-the-go”功能(我相信是2016b吗?),并且选择实现此功能的方式与八度有所不同(大概保持八度为八度?:p)。
Octave的实现有效地直接遵循了语言规则。以“函数声明”以外的语句开头的任何文件均被视为脚本,即一系列独立的语句。因此,脚本开始处无害的1
就像它获得的“非功能声明”语句一样简单,但实际上可以是任何东西。然后,脚本可以具有所需的多个“运行中”函数定义。对于要在“移动中”上下文中使用功能的语句,显然必须先定义该功能。这是基于以下基本原理:与功能相反,脚本有效地表示了一组简单的语句,这些语句按顺序运行而无需任何预处理,并且可以期望将这些命令简单地复制/粘贴到命令中。终端,并希望它们运行。
Matlab的最新实现有效地打破了这种功能/范式。要了解我的意思,请将上面的代码复制粘贴到一个新的终端中(或突出显示然后按F9键),然后观察它是否破裂。脚本不再是可复制/可粘贴的,而是假定matlab将先阅读并首先加载任何函数定义,然后返回并尝试运行其余命令;换句话说,matlab现在有点像处理其功能一样对待脚本。请注意,matlab仍然需要脚本以非功能声明语句开头,因此该位实际上与需要以“ 1”开头的八度音程相同。唯一更改的是这种先行行为,可抢先加载“运行中”功能,我认为这在脚本上下文中不一定是件好事。
我想说一下,尽管您在使用Matlab时(无意地)将脚本有效地视为不是脚本而对matlab指出了便利,但是Octave的方法更有意义。首先应该不应该做哪个。如果需要先行功能和嵌套,则实际上应该首先编写适当的功能并提供相关的作用域上下文。