跳转至内容

Octave

来自 ArchWiki

来自 官方网站

GNU Octave 是一种高级解释语言,主要用于数值计算。它提供了数值解决线性与非线性问题以及进行其他数值实验的能力。它还提供了用于数据可视化和操作的广泛图形功能。Octave 通常通过其交互式命令行界面使用,但也可以用于编写非交互式程序。Octave 语言与 Matlab 非常相似,因此大多数程序都易于移植。

安装

安装 octave 包。

使用 octave --gui 运行 GUI,或使用 octave-cli 运行 CLI。

备选图形界面

默认的 octave GUI 包含在 octave 包中。您也可以使用以下非官方 GUI 之一:

  • Cantor — 一个图形用户界面,将其数学运算委托给多个后端之一(Scilab、Maxima、Octave 等)。
https://apps.kde.org/en/cantor || cantor
  • JupyterLab — 基于浏览器的交互式环境,支持包括 Octave 在内的多种编程后端。
https://github.com/jupyterlab/jupyterlab || jupyterlab+jupyter-octave_kernelAUR

性能

Octave 默认使用 blas 包进行线性代数计算。然而,此实现并未利用现代 CPU 指令。为了加速性能,可以安装 blas-openblas 包作为 blas 的即插即用替代品。也可以根据可用硬件使用其他 BLAS 实现,例如 Intel CPU 的 intel-oneapi-mkl 或 NVIDIA GPU 的 cuda

为了说明这一点,可以使用以下代码来估算 NxN 矩阵乘法执行了多少 GFLOPS。

N = 4096;
A = single(rand(N, N));
B = single(rand(N, N));
start = clock();
C = A * B;
elapsedTime = etime(clock(), start);
gFlops = 2 * N * N * N / (elapsedTime * 1e9)

在 Intel Core i7-9750H 上运行以下代码

octave ~/test_program.m
gFlops = 3.7222

安装 openblas 并单线程运行程序后

OMP_NUM_THREADS=1 octave ~/test_program.m
gFlops = 121.55

让 openblas 使用 9750H 上所有 12 个可用线程后

OMP_NUM_THREADS=12 octave ~/test_program.m
gFlops = 281.33

Octave-Forge

Octave 通过 Octave-Forge 提供了一套类似于 Matlab 工具箱的包。包的完整列表 在此处

包可以通过 #使用 Octave 的安装程序#使用 AUR 进行安装。

使用 Octave 的安装程序

可以使用 Octave 的安装程序管理包。它们安装在 ~/octave,或使用 -global 选项安装在系统目录中。要安装一个包:

octave:1> pkg install -forge packagename
注意:一些 Octave 包,如 control,需要 Arch Linux 的 gcc-fortran 包才能编译和安装。

要卸载一个包:

octave:3> pkg uninstall packagename

一些包会被 Octave 自动加载,对于那些不会自动加载的包:

octave:4> pkg load packagename

不建议加载所有包,因为它可能会影响性能并导致名称冲突。如果您确实想加载所有包,可以执行:

octave:5> cellfun (@(x) pkg ("load", x.name), pkg ("list"));

要查看已加载的包,请使用 pkg list,带有星号的包是已加载的包。

确保在 Octave 启动时加载所有包的方法:

/usr/share/octave/site/m/startup/octaverc
## System-wide startup file for Octave.
##
## This file should contain any commands that should be executed each
## time Octave starts for every user at this site. 
 pkg load all

使用 AUR

一些包可以在 AUR 中找到(搜索包)。新的 Arch Octave-forge 包可以使用 Octave-forge Arch Linux 辅助脚本 半自动创建。

绘图

Qt 是默认的绘图后端。

>> available_graphics_toolkits
ans =
{
  [1,1] = fltk
  [1,2] = qt
}
>> graphics_toolkit
ans = qt

另外,您还可以使用 FLTK 或 Gnuplot 后端(通过安装 gnuplot)并运行以下命令:

>> graphics_toolkit("gnuplot");

要使此更改永久生效,请将其添加到您的 ~/.octaverc 文件中。

读取 Microsoft Excel 电子表格

您可以使用 odsreadxlsread 函数打开 .ods.xls.xlsx 文件,这需要 octave-ioAUR 包。

octave:1> odsread('myfile.ods');
octave:1> xlsread('myfile.xls');
octave:1> xlsread('myfile.xlsx');

转换为 CSV 格式

或者,首先使用 LibreOffice Calc(有限制,最多 1024 列)或 Calligra Sheetscalligra,有限制,最多 32768 列)将文件转换为 .csv 格式。

转换完成后,您可以使用内置的 Octave 函数 csvread 来读取 .csv 文件。

octave:1> csvread('myfile.csv');

故障排除

Zsh 无法解码的令牌

如果您收到错误:

undecodable token: b(hex)[23m

在打印时,安装 grml-zsh-config 并重新登录。

vi 模式无法解码的令牌

对于其 .inputrc 配置为 vi 模式的用户,例如,设置为:

~/.inputrc
$include /etc/inputrc
set editing-mode vi
$if mode=vi

set show-mode-in-prompt on
set vi-ins-mode-string \1\e[6 q\2
set vi-cmd-mode-string \1\e[2 q\2

set keymap vi-command
# these are for vi-command mode
Control-l: clear-screen
Control-a: beginning-of-line

set keymap vi-insert
# these are for vi-insert mode
Control-l: clear-screen
Control-a: beginning-of-line

$endif

可能会导致 Octave GUI 提示符损坏,显示为 q>> undecodable token: \001b(hex)[6\0020(hex)。要解决此问题,请通过将上述 .inputrc 更改为以下内容来禁用 Octave 的 show-mode-in-prompt 设置:

~/.inputrc
$include /etc/inputrc
set editing-mode vi
$if mode=vi

$if Octave
set show-mode-in-prompt off
$else
set show-mode-in-prompt on
set vi-ins-mode-string \1\e[6 q\2
set vi-cmd-mode-string \1\e[2 q\2

set keymap vi-command
# these are for vi-command mode
Control-l: clear-screen
Control-a: beginning-of-line

set keymap vi-insert
# these are for vi-insert mode
Control-l: clear-screen
Control-a: beginning-of-line
$endif

$endif

参见