如何在Ocatve中制作具有多个函数的函数文件

Log*_*gle 1 octave

我知道你可以在 Octave 中创建一个函数文件,其中文件名与定义一个函数的函数相同,但我想在一个文件中定义多个函数。有什么方法可以做到这一点,或者我是否需要为每个函数创建一个单独的文件。

Tas*_*nou 5

在这个答案中,我将假设您的主要目标是一个整洁的工作空间,而不是明确的单文件要求。

让我们摆脱单文件方法。您可以创建脚本m 文件(不是函数 m 文件),并在其中定义许多命令行函数。八度手册有一个关于此的部分。这是一个例子:

% in file loadfunctionDefinitions.m
1;   % statement with side-effect, to mark this file as a script. See docs.
function Out = Return1(); Out = 1; end
function Out = Return2(); Out = 2; end
% ... etc
Run Code Online (Sandbox Code Playgroud)

% in your main octave session / main script:
X = Return1() + Return2();
Run Code Online (Sandbox Code Playgroud)

但是,一般不建议这样做。特别是如果您需要与 matlab 兼容的代码,因为 matlab 比 Octave 晚得多才引入“脚本局部函数” ,并且决定以与现有 Octave 实现不兼容的方式进行操作:matlab 期望在最后定义脚本局部函数脚本的;Octave 希望在首次使用之前定义它们。然而,如果你使用普通的函数文件,一切都很好。

虽然我很欣赏“我不喜欢一个充满功能的文件夹”的情绪,但每个文件一个功能的方法实际上有很多好处(特别是如果您从终端进行编程,这使得大量工具的使用量增加了一倍)有用)。例如,您可以轻松地使用grep来查找哪些函数使用了特定变量。或者比较不同提交中各个函数的变化等。

通常,问题更多的是当存在其他重要文件(例​​如数据等)时,使此类功能文件散布在目录中,并且在一个地方拥有如此多的文件使得很难找到您想要的内容,并且感觉不整洁。但是,您可以采用许多其他方法,而不是使用带有命令行定义的单个文件,从编程的角度来看,这些方法可能也更好,例如:

  • 只需创建一个“辅助函数”文件夹,并将其添加到您的路径中。
  • 只要合适,就在主函数中使用子函数,以最大程度地减少不必要的文件数量
  • 使用私有函数文件夹
  • 使用“包目录”,即以字符“+”开头的文件夹,它为其中包含的函数创建命名空间。例如,~/+MyFunctions/myfun.m可以从~/via访问MyFunctions.myfun(),而不必添加+MyFunctions到路径(事实上你不应该这样做)。
  • 创建一个适当的类目录,并创建该类的函数方法

如果您使用基于更新样式的类,最后一个选项也可以实现单文件解决方案classdef,它允许您在与类定义相同的文件中定义方法。classdef但请注意,对定义类的八度支持仍然有些有限