首页 > 解决方案 > 如何在 Ocatve 中制作具有多个功能的函数文件

问题描述

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

标签: octave

解决方案


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

让我们摆脱单文件方法。您可以创建一个脚本m 文件(不是函数 m 文件),并在那里定义许多命令行函数。octave 手册对此有一节。这是一个例子:

% 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

% in your main octave session / main script:
X = Return1() + Return2();

但是,通常不建议这样做。特别是如果您需要与 matlab 兼容的代码,因为 matlab 比 octave 引入“脚本本地函数”晚得多,并决定以与现有 octave 实现不兼容的方式来执行它:matlab 期望脚本本地函数在最后定义剧本;octave 期望它们在第一次使用之前被定义。但是,如果您使用普通函数文件,一切都很好。

虽然我很欣赏“我不喜欢一个充满函数的文件夹”的情绪,但每个文件一个函数的方法实际上有很多好处(特别是如果你从终端编程,这使得丰富的工具成为两倍有用)。例如,您可以很容易grep地找到使用特定变量的函数。或者比较来自不同提交的单个函数的变化等。

通常,问题更多是这样的功能文件在目录中乱扔垃圾,当其他重要文件存在时,例如数据等,并且在一个地方拥有如此多的文件会使您难以找到想要的内容,并且感觉不整洁。但是,除了具有命令行定义的单个文件之外,您还可以采用许多其他方法,从编程的角度来看,这些方法可能也更好,例如:

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

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


推荐阅读