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

标签 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

为什么我会收到这个错误?

最佳答案

为了正确回答你的问题,我需要指出两点:

  • 在 Octave 和 matlab 中创建函数的规范方法是将它放在一个同名的专用文件中,并以函数声明开头。其推论是,路径中以函数声明开头的任何文件都会在启动时被检测到,并作为可调用函数提供给用户。
  • Octave 多年来一直支持“on-the-go”函数定义(实际上也支持随后将此类“on-the-go”函数“导出”到文件中); matlab 最近才包含“移动”功能(我相信是 2016b?),并且选择了与 Octave 不同的实现方式,(大概是为了保持 Octave 不变?:p)

  • Octave 的实现有效地直接遵循了语言规则。任何以不是“函数声明”的语句开头的文件都被视为脚本,即一系列独立的语句。因此无害 1在脚本的开头,它就像一个简单的“非函数声明”语句,但实际上它可以是任何东西。然后,脚本可以根据需要具有尽可能多的“on-the-go”函数定义。对于在“on-the-go”上下文中使用函数的语句,显然需要首先定义该函数。这遵循一个基本原则,即与函数相反,脚本有效地表示一组简单的语句,这些语句按顺序运行,无需任何预处理,并且人们可以期望简单地将这些命令复制/粘贴到它们的终端并期望它们运行。

    Matlab 最近的实现有效地打破了这种功能/范式。要了解我的意思,请将上面的代码复制粘贴到新的终端中(或突出显示然后按 F9)并观察它是否中断。脚本不再是可复制/粘贴的,但假设 matlab 将先读取并加载任何函数定义,然后返回并尝试运行剩余的命令;换句话说,matlab 现在有点像对待它的功能一样对待脚本。请注意,matlab 仍然需要一个脚本来以非函数声明语句开头,因此实际上该位与需要以“1”开头的 Octave 音程相同。唯一改变的是这种预先加载“on-the-go”函数的前瞻行为,我认为这在脚本上下文中不一定是一件好事。

    我认为 Octave 的方法更有意义,尽管您在(无意中)将脚本视为有效而不是脚本时指出使用 matlab 很方便。应该首先不应该这样做。如果您需要前瞻功能和嵌套,您真的应该首先编写适当的函数并提供相关的范围上下文。

    关于octave - 在 Octave 中运行包含本地函数的简单脚本时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50404236/

    相关文章:

    matlab - 如何在 matlab/octave 中矢量化这个丑陋的嵌套循环?

    matlab - 使用 Octave\MatLab 进行 ML 梯度下降成本函数的简单演算到底是如何工作的?

    r - 比较 Octave ML 结果与R结果

    matlab - 在两个序列的匹配部分之间画线

    octave - 无法在 Octave 中安装包 optim

    machine-learning - 逻辑检查。 Octave

    matlab - 如何将 f(x,y) 转换为二维矩阵(即查找表)?

    exception - 在 GNU Octave 中,如何捕获异常

    matlab - Mablab/Octave - 使用 cellfun 将一个矩阵与另一个矩阵建立索引

    matlab - 使用 PCA 投影到 Octave 中的低维空间