在Octave中运行包含本地函数的简单脚本时出错

时间:2018-05-18 05:19:24

标签: octave

我的文件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

为什么会出现此错误?

2 个答案:

答案 0 :(得分:3)

要正确回答你的问题,我需要指出两件事:

  1. 在octave和matlab中创建函数的规范方法是将其放在同名的专用文件中,并使用函数声明启动该文件。这样做的必然结果是,在启动时检测到以函数声明开头的路径中的任何文件,并将其作为可调用函数提供给用户。

  2. Octave多年来一直支持“随时随地”的功能定义(实际上也支持随后将'on-the-go'功能导出到文件中); matlab最近才包含'on-the-go'功能(2016b我相信?),并且选择实现这个与八度音程有所不同,(大概是为了保持八度音调?:p)

  3. 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

由于这种不兼容性,问题在于人们是否应该真正使用局部函数。也许应该在文件中使用“普通”功能...