Octave
援引自Octave 官网:
- GNU Octave 是一种解释性的高级程序设计语言, 主要应用在数值计算领域。其拥有线性和非线性问题求解,以及执行其他数值分析的能力,还为数据可视化与数据操作提供了丰富的图形功能。 Octave通常的使用方式是交互式命令行,但其也可以用来编写非交互式程序。 Octave语言与Matlab非常相似,因此在两个平台编写的大部分程序都可以很容易移植。
安装[编辑 | 编辑源代码]
打开GUI界面octave --gui
,或者打开命令行界面octave-cli
其他可供选择的图形界面[编辑 | 编辑源代码]
默认的 octave 图形界面 已经包含在了 octave包 软件包中。除此之外,你还可以选择使用下列非官方的图形界面:
- Cantor — 一个图形用户界面,其后端的数学运算可以由以下软件之一提供 (Scilab, Maxima, Octave, R, Julia and others).
- JupyterLab — 一个基于浏览器的交互式环境,支持多种语言作为后端,也包括Octave。
性能[编辑 | 编辑源代码]
Octave默认使用blas包包进行线性代数计算。然而blas的实现并未利用到现代CPU的指令集。blas-openblas包作为blas的直接替代,安装该包可提升计算性能。根据硬件配置可选择其它BLAS实现,Intel处理器可安装intel-oneapi-mkl包包,NVIDIA图形处理器可安装cuda包。
下面的代码估计了不同情况下计算NxN矩阵乘法的性能,以GFLOPS计:
test_program.m
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
使用全部12个线程运行该代码:
OMP_NUM_THREADS=12 octave ~/test_program.m
gFlops = 281.33
Octave-Forge[编辑 | 编辑源代码]
Octave提供一系列的外部包,类似于Matlab的工具箱, 参见 Octave-Forge.完整包列表参见这里.
这些外部包可以 #通过Octave自带安装器安装或者 #通过AUR安装.
通过Octave自带安装器安装[编辑 | 编辑源代码]
外部包可以通过Octave自带安装器进行管理。 一般情况下他们会被安装到 ~/octave, 当使用-global
选项的时候会被安装到一个系统目录。
安装一个外部包:
octave:1> pkg install -forge packagename
control
, 需要 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 (search packages)中找到.
适用于 Arch 的 Octave-forge 可以通过 Octave-forge helper scripts for Archlinux 实现半自动更新.
绘制图表[编辑 | 编辑源代码]
Qt是默认的绘图后端:
>> available_graphics_toolkits ans = { [1,1] = fltk [1,2] = qt } >> graphics_toolkit ans = qt
你也可以选择FLTK,或者gnuplot包然后通过以下命令切换绘图后端:
>> graphics_toolkit("gnuplot");
将它添加进~/.octaverc
以使变更一直有效.
读取电子表格[编辑 | 编辑源代码]
你可以使用odsread
或者xlsread
打开.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[编辑 | 编辑源代码]
如果显示了下面的错误:
undecodable token: b(hex)[23m
安装grml-zsh-config包并重新登录。
vi Mode Undecodable Token[编辑 | 编辑源代码]
为vi-mode模式配置.inputrc
的用户,例如使用下列配置的:
~/.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图形用户界面命令行提示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