我的文件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
为什么会出现此错误?
答案 0 :(得分:3)
要正确回答你的问题,我需要指出两件事:
在octave和matlab中创建函数的规范方法是将其放在同名的专用文件中,并使用函数声明启动该文件。这样做的必然结果是,在启动时检测到以函数声明开头的路径中的任何文件,并将其作为可调用函数提供给用户。
Octave多年来一直支持“随时随地”的功能定义(实际上也支持随后将'on-the-go'功能导出到文件中); matlab最近才包含'on-the-go'功能(2016b我相信?),并且选择实现这个与八度音程有所不同,(大概是为了保持八度音调?:p)
Octave的实施有效地遵循了语言规则。任何以不是'函数声明'的语句开头的文件都被视为脚本,即一系列独立语句。因此,脚本开头的无关1
就像它获得的“非函数声明”声明一样简单,但实际上它可能是任何东西。然后,脚本可以根据需要具有尽可能多的“移动中”功能定义。对于在“on-the-go”上下文中使用函数的语句,该函数显然需要首先定义。这是基于这样一个基本原则:脚本与函数形成对比,有效地表示一个简单的语句集合,这些语句按顺序运行而不需要任何预处理,并且可以简单地将这些命令复制/粘贴到它们的终端并期望它们运行。
Matlab最近的实现有效地打破了这个功能/范例。要查看我的意思,请将上面的代码复制粘贴到一个新终端(或突出显示然后按F9)并观察它是否中断。脚本不再是复制/可粘贴的,但假设matlab将提前读取并加载任何函数定义 first ,然后返回并尝试运行其余命令;换句话说,matlab现在有点像脚本一样对待它的功能。请注意,matlab仍然需要一个脚本以非函数声明语句开头,因此这个位有效地与需要以'1'开头的八度相同。唯一改变的是这种预先加载“移动”功能的前瞻性行为,我认为这在脚本环境中不一定是好事。
我认为Octave的方法更有意义,尽管你在(无意中)将脚本视为有效而非脚本的时候用matlab指出了方便。一开始可能不应该做哪一个。如果您需要前瞻功能和嵌套,那么您应该首先编写一个正确的函数并提供相关的作用域上下文。
答案 1 :(得分:1)
I had the same question/problem and some people gave the hints。但是由于没有明确的示例,因此我将其张贴在此处,以便其他人可以找到针对Octave和MATLAB的显式运行示例。
% works in Octave %%%
% sth. must be *before* a (local) function is declared
1; % or "2;" or "1+1;" or whatever
% local function must be declared *before* it is run in Octave
function retval = pluse(input1, input2)
retval = input1 + input2;
end % or "endfunction"
% Now you can use the local function
pluse(1, 2)
Octave和MATLAB之间不兼容,因为MATLAB示例不能在Octave中运行,反之亦然:
% works in MATLAB %%%
% You can use the local function
pluse(1, 2)
% local function must be declared at the end of file for MATLAB
function retval = pluse(input1, input2)
retval = input1 + input2;
end
由于这种不兼容性,问题在于人们是否应该真正使用局部函数。也许应该在文件中使用“普通”功能...