Skip to content

MATLAB - GNU Octave

GNU Octave 是一种高级解释型语言,主要用于数值计算。它被广泛认为是 MATLAB 的一个强大、免费和开源的替代品。对于许多应用,特别是在学术界和个人项目中,Octave 提供了一个高度兼容的环境。

MATLAB 和 Octave 的核心相似之处包括:

  • 基于矩阵的语法:两种语言都以矩阵作为基本数据类型。
  • 核心功能:它们共享大量内置数学函数,用于线性代数、数据分析和信号处理。
  • 脚本和函数:两者都支持使用用户定义的脚本和函数进行过程式编程。
  • 图形:两者都具有强大的二维和三维绘图功能。

由于 GNU Octave 是在 GNU 通用公共许可证(GPL)下发布的,它为数值计算领域提供了一个免费的入门点。

虽然 Octave 力求兼容,但关键差异依然存在。大多数编写良好的 MATLAB 核心任务脚本都可以在 Octave 中运行,但反之则不总是如此,因为 Octave 的解析器可能更宽松。

现代版本的一个关键区别在于文本的处理方式:

  • MATLAB:支持两种文本数据类型。字符数组使用单引号定义(例如 'hello'),并且是字符矩阵。字符串使用双引号定义(例如 "hello"),并且是 R2016b 中引入的一种更灵活、更现代的数据类型。
  • Octave:传统上使用单引号表示字符串。虽然它现在支持双引号字符串,但它们的行为和集成可能与 MATLAB 的 string 类不同。严重依赖 MATLAB 字符串特有功能的代码可能需要修改才能在 Octave 中运行。

MATLAB 提供大量专业开发、集成的工具箱(Toolboxes),用于特定领域(例如,控制系统、深度学习、图像处理)。Octave 使用社区维护的包(Packages)(例如,symbolic、signal),这些包可以加载以扩展其功能。虽然许多包镜像了工具箱的功能,但它们可能不如工具箱那样全面、优化或完善。

此示例用于为函数 g = x * exp(-x^2 - y^2) 创建三维曲面图,在 MATLAB 和 Octave 中运行结果相同,展示了它们在矩阵操作和绘图方面共享的核心语法。

% 创建 x 和 y 坐标网格
[x, y] = meshgrid(-2:0.2:2);
% 在网格上的每个点计算函数 g 的值
g = x .* exp(-x.^2 - y.^2);
% 创建三维曲面图
surf(x, y, g);
% 添加标签以便清晰
title('3D Surface Plot of g = x*exp(-x^2-y^2)');
xlabel('x-axis');
ylabel('y-axis');
zlabel('g-value');

预期输出: 将显示一个三维彩色曲面图,通常被称为“墨西哥帽”图,在一个新的图窗窗口中。

以下是如何数值计算曲线 f(x) = x^2*cos(x) 从 x = -4 到 x = 9 的面积。这突出了使用 MATLAB 内置函数与 Octave 中类似函数之间的差异。

现代 MATLAB 使用 integral 函数,它经过高度优化且鲁棒。

% 将函数定义为匿名函数句柄
f = @(x) x.^2 .* cos(x);
% 定义积分限制
lower_limit = -4;
upper_limit = 9;
% 计算积分
a = integral(f, lower_limit, upper_limit);
% 显示结果
fprintf('The calculated area is: %f\n', a);

MATLAB 输出: The calculated area is: 0.332601

Octave 使用 quad 函数(来自较旧 MATLAB 版本中的 quad 函数)或 integral 来完成此任务。此处显示 quad 是为了对比。

% 将函数定义为内联函数或匿名函数
f = @(x) x.^2 .* cos(x);
% 定义积分限制
lower_limit = -4;
upper_limit = 9;
% 使用 quad 函数计算积分
[a, ierror, nfneval] = quad(f, lower_limit, upper_limit);
% 显示结果
printf('The calculated area is: %f\n', a);

Octave 输出: The calculated area is: 0.332601

  • 选择 MATLAB 的场景:专业/工业环境、需要高性能的应用程序、广泛且专业的工具箱,以及官方支持。
  • 选择 GNU Octave 的场景:学术用途(它通常是标准)、免费学习数值计算概念、开源开发,以及在没有 MATLAB 许可证的服务器或系统中运行脚本。