Python
Python · 脚本 · 数据分析
脚本、数据分析、爬虫和不少课程作业的默认语言。
正在打开工具详情…
开源数值计算,语法接近 MATLAB,适合作业和原型。
要跑矩阵、绘图、数值作业,没有 MATLAB 许可。
必须使用某个 MATLAB 独家工具箱,或只要电子表格。
GNU Octave 是和 MATLAB 语法基本兼容的开源数值计算语言。它的定位很清楚:让你在有 MATLAB 许可的机器上也能跑那些矩阵、拟合、绘图的代码。
它和 MATLAB 的兼容程度比想象的深:绝大多数 .m 文件可以直接跑,矩阵运算与数学函数的写法一致,绝大多数绘图函数同名同参。差别集中在几处:Octave 没有 MATLAB 的工具箱(工具箱对应的东西叫 Octave Forge,是社区另写的包,质量与覆盖度都不能比);脚本语言层的差别会导致「本该是矩阵乘的地方我写了 * 」这类语义不一致,Octave 里 a * b 与 MATLAB 一样是矩阵乘但对向量维度的报错更早;还有就是 end 关键字、匿名函数、子函数这些语法细节有差异。真要跨平台共用同一份代码,Octave 官方有一份详尽的「与 MATLAB 的差异」清单可以对照。
它的短板也要说清。图形后端是 gnuplot 或 fltk,出的图能看但没有 MATLAB 那么精细的渲染质量与交互;并行计算、性能优化工具链、IDE 集成都弱一代;社区规模比 MATLAB 小得多,遇到冷门问题搜不到答案。数据处理生态上它也基本被 Python 的 NumPy / SciPy / pandas 取代了——如果从零开始选工具而不是维护 MATLAB 存量代码,Python 那条路通常更宽。
它真正的使用场景因此主要是两个:跑课程或文献里给定的 MATLAB 代码,以及在不允许 MATLAB 许可的环境里顶替它。许可证是 GPL-3.0,Windows、macOS、Linux 都有官方安装包,官网 https://octave.org/download 提供下载,Windows 版也可以配合 MinGW 与图形环境装。
上手步骤之外的具体做法:常见场景怎么配、命令怎么写、报错怎么处理。
讲清 Octave 与 MATLAB 的关键语法差异、pkg 包管理、脚本函数化与向量化写法,让从 MATLAB 迁移的代码能真正跑起来。
Octave 的目标是与 MATLAB 兼容,绝大多数基础函数能直接跑,但语法细节差异足以让脚本静默出错。
| 事项 | MATLAB | Octave |
|---|---|---|
| 注释符 | % | % 或 # |
| 不等于 | ~= | ~= 或 != 都行 |
| 块结束 | 必须 end | 可省略,end 也接受 |
| 字符串 | ' 是字符," 是字符串 | ' 与 " 等价 |
| 清屏 | clc | clc 一样用 |
| 函数定义文件 | 必须单独成文件 | 可在脚本中直接定义 |
最危险的是字符串:MATLAB 里 ' 是字符向量,Octave 里两者都是字符串。这会导致 sprintf('%c', 65) 在两边行为不同。
另一个坑是隐式扩展:Octave 从 4.4 起支持 A.^B 形式的隐式扩展,但 A + B 这种标量扩展仍要自己写 A + scalar,不能指望自动广播。MATLAB 里写惯的隐式扩展在 Octave 中可能给出维度错误或静默的错误结果,这是最常见的迁移问题。
if 的条件必须是标量布尔值,不能直接传数组。正确写法是用 any / all:
octave% 错误:条件是数组
% if A > 0
% 正确
if any(A(:) > 0)
disp("有正数");
end
if all(A > 0)
disp("全部为正");
end社区包称 Octave Forge,必须先安装再 load,命令是 pkg:
octavepkg list % 查看已安装的包
pkg install -forge io % 安装包(需要联网)
pkg load io % 加载后才能调用其函数最容易忘的是 pkg load:装完包直接调用函数会报 undefined。新建会话后要重新 load,可以写进脚本开头,或用 ~/.octaverc 放全局配置。常用统计包:statistics(描述统计、分布拟合)、io(读写 CSV/Excel)。安装失败时先 pkg update 升级包索引。
Octave 的解释器循环性能弱,批量运算应尽量向量化:
octave% 逐元素用循环,慢
n = 10000;
y = zeros(n, 1);
for k = 1:n
y(k) = sin(k) + k^2;
end
% 向量化,快很多
k = (1:n)';
y = sin(k) + k.^2;注意 ^2 是矩阵幂(维度必须吻合),.^2 才是逐元素幂。数据是行向量时 k^2 会直接报非方阵错误。
脚本直接执行、变量留在工作区,出问题难追溯。函数有独立作用域,调试与复用都更好:
octavefunction [m, se] = mystats(x)
x = x(:); % 强制成列向量,避免行向量传进来出错
n = numel(x);
m = sum(x) / n;
if n < 2
se = NaN;
else
se = std(x, 0) / sqrt(n);
end
end两个易错点:一是忘了 end 收尾导致后续代码被当函数体吃掉;二是函数文件文件名必须与函数名一致且同目录。函数内调另一个函数时确认文件已在路径上(addpath 加入,path 查看)。
dbstop 单步调试、keyboard 插入断点、dbstack 看调用栈,与 MATLAB 一致。查函数用法用 help、doc、lookfor(如 doc hist)。在线手册在 Octave 官方文档(在新标签页打开),函数索引按字母排列,与 MATLAB 文档结构对应,找函数几乎零成本。