LWN: GNU Octave发布新版本!

关注了就能看到更多这么棒的文章哦~

A new release for GNU Octave

December 15, 2020
This article was contributed by Lee Phillips
DeepL assisted translation
https://lwn.net/Articles/840050/

11 月 26 日,GNU Octave 的 6.1 版本发布。GNU Octave 是用于数值计算(numerical computing)的一种语言和环境。在这个新版本中,有一些新增功能和改进,包括改善了图形输出,提供了更好的与 web service 的数据通讯,以及 40 多个新功能。我们将介绍一下 Octave 在科学家和工程师的数值工具中的地位,并回顾一下它的悠久历史。

What is GNU Octave

用它的手册上的话来说:

GNU Octave 是一种高级语言,主要用于数值计算(numerical computations)。它通常用于对线性和非线性方程求解、数值线性代数、统计分析等问题,也用于进行其他数值实验。

Octave 是按 GPLv3 发布的自由软件。该程序于 1993 年首次公开发布,最初是作为化学工程类学生的教学工具。James B. Rawlings 和 John G. Ekerdt 两位教授希望让学生们使用 Fortran,但发现他们花了太多的时间来让他们的程序成功编译和执行,而不是把时间花在作业的实际内容上。于是教授们创建了早期版本的 Octave,从而作为一种更简单方式供学生们选择。项目的名字是向已故的 Octave Levenspiel 致敬,他是 Octave 的主要原作者 John W. Eaton 的前教授。Octave 在 1997 年成为 GNU 项目的一部分。

要了解 Octave 的后续发展,需要对另一个工具有一定的认识,这个工具叫做 MATLAB,它也是作为 Fortran 的替代品而创建的。关于 MATLAB 的起源,有一个有趣的故事:它的诞生,是为了让学生能够使用 Fortran 的线性代数例程(routine),而不必编写 Fortran 程序。作者后来把它变成了一个商业产品,并取得了相当大的成功。现在,这个功能强大(且价格昂贵)的系统已被全世界数百万工程师和科学家使用。这就创造了一个做数值计算的市场:人们习惯了 MATLAB 的语法,但在离开所在的公司或研究机构后就无法继续使用它了。并且,有些人还对自由软件中的替代品感兴趣。

现在有几种选择,兼容程度不同。用 C、C++和 Fortran 编写的 Octave,很快就采取了完全兼容 MATLAB 的目标和策略。根据 Octave Wiki 的记载,Octave 和 MATLAB 之间的任何差异都被当做是错误来处理,"一般来说",大多数现成的 MATLAB 脚本在 Octave 中执行时都可以不加修改地正常工作起来,反之亦然。有一些例外情况,比如使用了 Octave 中引入的语法来进行扩展的脚本,或者使用了 MATLAB 中尚未在 Octave 中实现的最新功能的脚本。

一代又一代的工程师都在 MATLAB 中成长起来,它的触及范围非常广,甚至对最新开发的 Julia 语言也产生了影响,我最近在 LWN 也介绍过(https://lwn.net/Articles/834571/)。MATLAB 和 Octave 刻意将注意力局限在数值(numerics)方面,特别关注矩阵计算,而 Julia 则是一种真正的通用语言。但 Julia 和 MATLAB 一样,对数组的索引编号是从 1 而不是 0 开始的,它处理数组的语法部分是为了给离开 MATLAB 的人们提供很熟悉的舒适感,而不是希望成为之前语言的克隆。

最新版本的 Octave 在 Debian unstable 中已经有 package 了,但不喜欢使用 unstable 的发行版用户可能需要自己编译最新的版本了。例如,Ubuntu 上的最新版本是 5.2(2020 年 1 月发布的)。Octave 是一个庞大的系统,有很多的依赖性,用户可能希望有能够避免自己编译也能拿到最新的版本。这里 (https://wiki.octave.org/Octave_for_GNU/Linux) 详细介绍了几种 Linux 发行版上的各种安装方法,以及编译 Octave 的详细指南。Octave 适用于 Windows 和 macOS,也有适用于 FreeBSD 和 OpenBSD 的软件包。

Using GNU Octave

当在终端中启动 octave 时,会弹出一个交互式的提示界面。用户可以输入表达式,并立即得到结果。换句话说,操作方式类似于 gnuplot、Maxima、Julia 以及其他提供 read-eval-print loop(REPL)交互方式的程序。REPL 提供了对函数和变量名的 tab 补全,其工作原理类似于命令行上的 Bash tab 补全。它还提供了很有用的命令历史功能,以及支持通过 readline 进行编辑。

如果在调用 Octave 时添加–gui 标志,它的图形环境就会迅速出现在屏幕上,而不再是一个简单的 REPL 提示符界面。图形界面中充斥着人们习惯了的各种图标排布,当鼠标悬停在上面时,会有提示信息显示出来,顶部还有标准的分级菜单栏。其中一个菜单项 "help",会打开内置的手册副本,如下图所示。能在本地拥有一份完整的、支持超链接的手册是很方便的。它允许搜索函数列表,也可以对某个具体页面中的内容进行搜索,但不能够直接对整个手册的文本进行搜索。

[Octave manual]

尽管这本手册相当详尽,几乎介绍了 Octave 语言的所有方面,因为 Octave REPL 中会使用到这些语言,在文本编辑器中编写脚本时也会用到。但是,它没有包含任何关于 GUI 的帮助,GUI 从 3.8 版本开始就作为实验性功能随 Octave 一起提供,并在 4.0.0 中完全支持。既没有说明如何使用它,也没有说明它为用户提供了哪些额外的功能。在 Octave Wiki 中也没有什么很有帮助的内容。

幸运的是,GUI 所提供的一切都可以通过实验来理解。在下面的插图中,我缩小了 GUI 窗口的大小,所以能得到更紧凑的屏幕截图,在正常操作中,用户是有更多操作空间的。我将使用 Octave GUI 来解决以下方程系统。

x + 2y + 3z = 2
3x + 2y + z = 2
2x + 2y + 2z = 2

工作环境看起来是这样的:

[Octave GUI]

左边是一个包含三个部分的面板。从上到下分别是文件浏览器、工作空间 (workspace) 用来显示所有当前定义变量的列表以及关于它们的类型、维数等信息、还有命令历史记录。

右边是主面板,它可以显示出多种不同的内容,通过底部的 tab 来控制。窗口布局可以根据用户的喜好来调整。每个面板都可以调整大小,任何面板也都可以被分割出来成为一个独立的窗口。

编辑器,这是用户编写和修改 Octave 脚本的地方。它提供了语法高亮和命令补全功能。用户输入时,会出现一个滚动框,显示所有可能的补全选项。该编辑器还提供了一个拥有常用功能的调试器,能够设置断点和单步执行脚本等。

我这个简单的三行脚本定义了一个 3x3 的系数矩阵,存储在变量 a 中,右值向量则存储在 b 中,最后调用 Octave 函数 linsolve(),它应该求解并返回三个变量的向量,对应着三个值。

面板中的脚本可以通过选择 "run" 菜单项或者点击带有黄色三角形的齿轮来运行。我这样做了之后,命令 tryOctave 就出现在命令历史面板中。这是我给我的脚本起的名字。但是输出在哪里呢?

可以看到工作区面板中出现了一个新的变量,叫做 ans,说明已经有计算执行过了。切换到 Command Window tab,如下图所示,就显示了脚本中每个命令的输出。这个面板是一个 REPL 面板,行为和从命令行调用 Octave 一样,也包括通用的 readline 功能。

[command panel]

从中我们可以看到打印出了系数矩阵,右值向量,以及通过 linsolve()计算出的三个变量的结果。

如果选择了 variable editor 面板,双击工作区中的变量,就会以类似电子表格的布局显示出来,如下图所示。这样就可以随意访问数组的元素,可以直接修改。

[Variable editor]

因此,GUI 看起来提供了很重要的功能,尽管它的外观看起来有点普通。它就相当于是一个 Octave 的 IDE。

这里还有一个例子,展示了 Octave 的内置图形显示功能以及另一个内置函数 fft(),从名字就知道它实现了快速傅里叶变换(FFT)。傅里叶变换会将一个周期性函数分解为不同频率的正弦和余弦之和,FFT 就是用来进行快速分解的算法。其实,我们人类可以在大脑中实时进行傅里叶变换,真的是这样。内耳会对声音进行傅立叶变换,并将不同的频率沿着不同的神经束发送给大脑。

[FFT example]

为了测试这个例程,我将选择一个已知结果的函数来进行傅立叶变换,也就是:方波(square wave)。在这个脚本的第一行中,我在变量 sw 中定义了方波的一个周期,将一个包含了 64 个 1 的 vector 附加到一个 64 个 0 的向量之后,创建出来了由 128 个数字定义的一个周期。第二行计算其 FFT,并将其存储在 tsw 中,也就是应该包含了频谱(spectrum):原始函数中频率的振幅。对于实值函数(real-valued function),频谱存储在结果的元素 2 到 N/2 位置中,所以我们可以从 tsw 中提取出来,并使用 bar() 函数绘制结果,从而创建一个条形图。注意,Octave 的索引语法在使用括号时也是遵循 MATLAB 语法的。

从结果中,我们可以看到(未归一化,un-normalized)的频谱出现在了一个图形窗口中。Octave 一直是使用 gnuplot 进行绘图了,后续计划继续将其作为一个选项。不过最近的版本也包含了一个 OpenGL 绘图后端,它与一些 Octave GUI 函数集成得更好,比如说,可以为用户与 Octave 脚本的交互来创建 GUI element。

在这些例子中,我只用到了 Octave 里大量内置函数中的少数几个。此外,还有一个官方的资源库,其中包含了大量的第三方软件包,几乎涵盖了数值分析中所有能想到的用途。

The new release

6.1.0 版本是一个重要的版本,有一长串用户可见的改动。许多改动是专门用来提高对 MATLAB 的兼容性的,包括跟上 MATLAB 最新行为的变化。

一些更有趣的增强和改动包括用来与网络服务进行通信的新函数,主要用在那些分析通过网络检索的数据的脚本中。此外,还有一些对数值细节的改进,如改进的随机数生成和数值积分。该版本还包括图形方面的许多 bug fix 和改进,包括字体平滑、图例控制、轴的绘制以及标签中上标和下标支持。此外,整个系统还更完整地集成了 Unicode。改进了软件包管理系统,删除了 4.x 系列中被废弃的几个功能,并增加了大约 40 个新功能。

Getting help

Octave 的资料相当齐全。尤其是手册,做得很好很完整。Octave 程序本身有大量的帮助,可以通过输入 "help" 获得。除了手册之外,还有一个 Octave Wiki,其中包含了 FAQ 和其他有用的信息。

还有许多关于 GNU Octave 的书籍。从一般介绍到特定学科研究人员指南的书都已经有了。许多书籍同时介绍了 Octave 和 MATLAB,这表明了两个系统的功能互相替代性。还有 Discourse 论坛可以用在普通用户获取帮助,也有专用于 Octave 开发者和一般社区讨论的论坛,以及仍然保留着 1992 年的记录的 help-octave mailinglist,还有 #octave IRC 频道。此外,该项目还维护了一个列表,其中列出了提供关于 Octave 使用方面的付费支持和咨询的各个公司。

Advice

我想,从上一节的两个例子中应该可以看出 Octave 的魅力。尤其是,线性代数和信号处理的例程都是现成的,我不需要输入任何 import 命令,也不需要弄清楚相关功能是在哪里的。这也是 Octave 比 Python 和 Julia 更胜一筹的地方:很多东西都是现成的。

由于 Octave 强大的数组语法,我也不需要写任何循环或者创建任何 dummy variable。在这两种情况下,只需几条简洁的语句就解决了挺麻烦的问题。而且当我想要看一下 plot 的时候,我只需要调用一下 plot 就可以了。同样也不需要 import 某个库(或等待它们 pre-compile)。一本完整的手册唾手可得,手册中的所有内容都可以立即使用,无需繁琐步骤、无需等待。Octave 提供了一个令人印象深刻的高效求解数值问题的方案。

对于一个对计算感兴趣并渴望使用自由软件的科学家或工程师来说,这是一个很好的时代。现在有各种成熟而强大的软件可供选择,有通用的解决方案,也有专注于特定学科的选项。然而,这种令人愉快的情况可能会造成选择困难。虽然软件是免费的,但选择任何一个特定的工具而不是其他工具,都要投入时间和精力。所以,人们要理性地选择。

对于那些已经接受过 MATLAB 训练,并且正在寻找数值探索和建模工具的人来说,Octave 是显而易见的最佳。而对于那些可能需要更通用的语言,或者着眼于执行大规模 simulation 的人来说,目前最好的选择可能是 Julia。此外,Python 可能会吸引那些想要在某些特定领域工作的人,比如机器学习,在这里它仍然是最流行的语言,并且有非常成熟的各种库的支持。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值