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 工具箱的软件包。软件包的完整列表在此处:here

软件包可以使用 #使用 Octave 的安装器#使用 AUR 安装。

使用 Octave 的安装器

可以使用 Octave 的安装器管理软件包。它们安装到 ~/octave,或者使用 -global 选项安装到系统目录中。要安装软件包

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

要卸载软件包

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 Linux 的 Octave-forge 助手脚本 半自动地创建用于 Arch 的新 Octave-forge 软件包。

绘图

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 Sheets (calligra,限制为 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)。要解决此问题,请为 Octave 禁用 show-mode-in-prompt 设置,方法是将上面的 .inputrc 更改为

~/.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

参见