就我观察,octave 不同版本号之间差异比较大,我现在说的 3.1 应该是和 Matlab 最接近的,而 2.x 还离得很远,这里我先就一些基本的问题说明一下。debian 里面 octave 一般分成下面几个 package,
- octave*.*,这是 octave 的主程序(还有一个汇报 bug 的程序)所在,常用的函数一般有二进制版本(称为 built-in 函数)放在 /usr/lib/octave/version/oct/arch/*.oct。
- octave*.*-common 里面主要是常用工具箱,m 文件多在 /usr/share/octave/version/m/toolbox-name/*.m。
- octave*.*-doc 里面是文档,我现在就使用的 3.1 系列的文档。
- octave*.*-htmldoc 还是文档。
- octave-ad 自动前向微商。
- octave-audio 处理音频。
- octave-bioinfo 处理生物信息学。
- octave-combinatorics 组合学。
- octave-comminiations 信号处理、通信。
- octave-control 控制理论。
- octave-data-smoothing 数据平滑化(似乎是用 Tikhonov regularizer?)。
- octave-econometrics 度量经济学。
- octave-epstk 生成 eps 文件。
- octave-financial 金融工具箱。
- octave-fixed 计算 fixed point。
- octave-ftp 在 octave 里面使用 ftp。
- octave-ga 就是遗传算法。
- octave-general 广义函数。
- octave-graceplot 原来 octave 调用 gnuplot 绘图,这个包用 grace。
- octave-gsl 提供 GSL 的支持。
- octave-ident 提供 system identification。
- octave-image 提供图像处理的功能。
- octave-informationtheory 提供信息论方面的函数。
- octave-io 提供输入输出支持。
- octave-irsa 提供 irregular sampling analysis。
- octave-linear-algebra 线性代数。
- octave-miscellaneous 一些杂七杂八的函数,如输出到 latex 等。
- octave-missing-functions 搜索 octave 里面没有的 matlab 函数。
- octave-nan 提供处理 NaN 的能力。
- octave-nnet 前馈神经网络。
- octave-netcdf 处理 NetCDF 数据。
- octave-octgpr 散乱数据插值(看起来像 Gaussian process regression)。
- octave-odebvp 线性常微分方程边值问题。
- octave-odepkg 常微分方程初值问题。
- octave-optim 优化工具箱。
- octave-optiminterp 最优插值。
- octave-outliers 发现 outlier。
- octave-parallel 并行计算。
- octave-pfstools 使用 octave 处理 HDR 图片。
- octave-phisicalconstants 物理常量。
- octave-plot 额外的作图工具。
- octave-plplot 对 PLplot 库的支持。
- octave-signal 信号处理。
- octave-sockets 提供 socket 的接口。
- octave-sp 半定规划。
- octave-specfun 特殊函数。
- octave-splines 样条。
- octave-statistics 统计函数。
- octave-strings 字符串处理。
- octave-struct 对结构体的支持。
- octave-symbolic 符号计算,基于 GiNaC 和 CLN。
- octave-time 日期时间处理。
- octave-tsa 时间序列分析。
- octave-vrml 虚拟现实工具箱。
- octave-senity 可能和 guide 类似。
以上可见 octave 并不比我们常用的 matlab 缺少很多功能,而且我们相信随着贡献者越来越多,一般科学研究需要的计算可以转交给 octave 来实现。我现在一些小的计算,懒的打开 Matlab,就会用 octave 来处理。数值计算的教学,我觉得有理由离开 Matlab 这个商业软件了。如果说 Scilab 并不顺手,那么 octave 已经不存在这个理由了。
不过,我们在这里还是列举一些 octave 和 Matlab 不同之处(参考这里),
- 搜索路径应使用 addpath,而不是老版本直接对 LOADPATH 变量赋值。
- Matlab 不支持 logical array 的 prod,但是 octave 支持。
- Matlab 不支持对 nargin 赋值,但是 octave 支持。
- Matlab 启动的时候执行 startup.m,octave 执行 /etc/octave*.conf。
- Matlab v6 的 mat 文件可以被 octave 读取。v7 的可以被 2.9 之后的读取。
- 不同长度的字符串在老版本的 octave 里面允许 vercat,而 matlab 不允许。
- Matlab 允许 ! 开头表示系统调用,octave 只允许使用 system 函数。octave 里面 ! 和 ~ 都表示取反。
- Matlab 不允许一个字符串和一个字符比较,但 octave 允许。
- hist.m 函数在 octave 里面有一个 normalization,matlab 没有。
- 老版本的 octave 通过环境变量 OCTAVE_VERSION 获得版本信息,matlab 和新版的 octave 使用 ver。
- cell array 和 struct 的显示方是不同。
- 函数 datastr 曾非常不一致。
- Matlab 的 load 和 octave 的 load --force 等价。
- Matlab 可以 load 读取空文件,octave 不允许。
- Matlab 没有 printf 只有 fprintf 和 sprintf,octave 都有。
- Matlab 的转置运算符和操作矩阵之间不允许有空格,octave 允许。
- Matlab 一行分割成几行需要用 ...,octave 可以省略或者用 \ 也行。
- 逻辑运算里面 Matlab 只允许 & 和 |,octave 允许 && ||(返回标量),和 & | (返回矩阵)。
- Matlab 用 ^ 表示指数运算,octave 还允许用 **。
- Matlab 的字符串用 ',octave 还可以用 "。
- Matlab 结构控制语句都用 end 结束,octave 还允许 end if/for 等。
- Matlab 调试 dbstep in 在 octave 为 dbstep、dbstep 在 octave 为 dbnext。
- Matlab 广义特征值用 eig(A, B),在 octave 为 qz( A, B)。
- Matlab 注释使用 %,octave 还可以使用 #。
- Matlab 不允许对立即矩阵取 index,即 [ 1 2 3 4]( 3 ) 是不合法的,octave 允许。
- Matlab 没有 += 这种类型的运算,octave 支持,并还支持 ++ --,和 C 一致。
- Matlab 在新版本里面实现了 exception handling 和 octave 的 unwind protect 不同。
- Matlab 实现 OOP 的风格不被 octave 接受。
- Matlab 使用 private 子目录不被 octave 接受。
后面,我们开始更进一步学习 octave。