跳转到内容

MATLAB 编程/Octave 和 MATLAB 之间的差异

来自 Wikibooks,开放世界中的开放书籍



Octave 主要是在 MATLAB 兼容性的前提下构建的。它与 MATLAB 具有许多共同的功能

  1. 矩阵作为基本数据类型。
  2. 内置支持复数。
  3. 强大的内置数学函数和广泛的函数库。
  4. 以用户定义函数的形式进行扩展。

Octave 和 MATLAB 之间存在的一些差异可以通过“用户首选项变量”来解决。

GNU Octave 在很大程度上与 MATLAB 兼容。但是,Octave 的解析器允许一些(通常非常有用)MATLAB 不支持的语法,因此为 Octave 编写的程序可能无法在 MATLAB 中运行。例如,Octave 支持使用单引号和双引号,而较旧版本的 MATLAB 仅支持单引号,这意味着如果您尝试使用双引号(例如在 MATLAB 上运行的 Octave 脚本中),则会发生解析错误。更新版本的 MATLAB 引入了双引号,但其功能与单引号不同(尽管在功能上有一些重叠)。必须相互协作的 Octave 和 MATLAB 用户需要注意这些问题并相应地进行编程。

注意:Octave 可以以“传统模式”运行(通过在启动 Octave 时包含--traditional标志),这使得它在使用某些仅限 Octave 的语法时会报错。

本章记录了 MATLAB 解析器无法运行但在 Octave 中可以运行的代码的实例,以及 Octave 解析器无法运行但在 MATLAB 中可以运行的代码的实例。此页面还包含关于 Octave(在传统模式下)和 MATLAB 之间不同事物的差异说明。

C 样式自动递增和赋值运算符

[编辑 | 编辑源代码]

Octave 支持 C 样式自动递增和赋值运算符

   i++; ++i; i+=1; etc.

MatLab 不支持。

布尔值的乘积

[编辑 | 编辑源代码]

MATLAB (R2011b) 和 Octave (3.6.4) 在计算布尔值的乘积时响应不同

  X = ones(2,2) ; prod(size(X)==1) 

  MATLAB: PROD is only supported for floating point input.
  Octave: ans = 0

它们在 MATLAB (R2015a) 及更高版本中都产生相同的结果 (ans=0)

Nargin 返回函数的输入参数数量。MATLAB (R2011b) 将不允许以下操作;Octave 将允许。

  function myfun = testfun(c)
    if (nargin == 1)
      nargin = 2;
    else
      nargin = 3
  end

startup.m

[编辑 | 编辑源代码]

MATLAB 将执行命令行调用目录中名为“startup.m”的文件。旧版本的 Octave 不会执行。从 Octave 4.2.0 开始,它的行为与 Matlab 相同。对于旧版本的 Octave,它将执行名为“.octaverc”的文件,该文件可以编辑以执行现有的启动文件。这意味着“.octaverc”可以编辑以查找并执行“startup.m”文件。

if ( exist ('startup.m', 'file') )
  source ('startup.m')  # load startup.m like MATLAB
endif

字符字符串和数组

[编辑 | 编辑源代码]

MATLAB 区分字符字符串和字符数组,而 Octave 则不区分。在 Octave 中

   >> ["foo" "bar"]
   ans = foobar
   >> ['foo' 'bar']
   ans = foobar

在 MATLAB 中

   >> ["foo" "bar"]
   ans = 
       1×2 string array
       "foo"    "bar"
   >> ['foo' 'bar']
   ans =
       'foobar'

解决方法:使用 strcat() 进行字符字符串连接。

['abc ';'abc']

[编辑 | 编辑源代码]

['abc ';'abc'] 现在在 Octave 和 MATLAB 中都允许;(MATLAB 之前会返回:?? Error using ==> vertcat)

在 Octave 和 MATLAB 中,结果将是一个 2x3 矩阵。

调用 Shell

[编辑 | 编辑源代码]

“! STRING”语法在 MATLAB 中调用带有命令 STRING 的 shell。Octave 不识别!作为系统调用,因为它用于逻辑运算。始终使用“system (STRING)”以确保兼容性。

如果您确实错过了这个单字符快捷方式,为了方便在命令行上使用,您可以在您的“.octaverc”文件中定义以下内容

  function S(a), system(a); end

现在“S STRING”将在 shell 中评估字符串。

尝试加载空文件

[编辑 | 编辑源代码]

MATLAB 允许您加载空文件,OCTAVE 不允许。

  system('touch emptyfile');
   A = load('emptyfile')
  MATLAB R2011b : A=[]
  Octave 4.2.0  : error: load: unable to determine file format of 'emptyfile'

fprintf 和 printf

[编辑 | 编辑源代码]

Octave 支持 printffprintf 作为打印到屏幕的命令。MATLAB 要求使用 fprintf

   foo = 5;
   printf ('My result is: %d\n', foo) % Prints to STDOUT. Octave only

fprintf 通过省略可选的文件句柄参数来覆盖写入屏幕和文件的操作

   foo = 5;
   fprintf('My result is: %d\n', foo) % Prints to STDOUT. Octave and MATLAB

空白字符

[编辑 | 编辑源代码]

MATLAB 不允许在转置运算符前使用空格,但 Octave 允许(它只是一个像其他运算符一样的运算符)。

   [0 1]'   % works in MATLAB and Octave
   [0 1] '  % works only in Octave

MATLAB 始终需要 ... 用于续行。

   rand (1, ...
         2)

而 Octave 也支持

   rand (1,
         2)

对于这两个程序,在数组中不带 '...' 的换行会移到下一行。

 >> R=[1 2 3
       7 8 9]
 R =
    1     2     3
    7     8     9

Octave 支持

   z = y = x + 3

MATLAB 需要

   y = x + 3
   z = y

Octave 允许

   global isOctave = (exist('OCTAVE_VERSION') > 0);

而 MATLAB 需要

   global isOctave;
   isOctave = (exist('OCTAVE_VERSION') > 0);

此示例还展示了如何在运行时检测解释器。

逻辑运算符 NOT

[编辑 | 编辑源代码]

Octave 允许用户对布尔值使用 ~ 和 !。第一个是为了与 MATLAB 兼容,而 ! 对 C/Java/等程序员来说会更熟悉。但是,如果您使用后者,您将编写 MATLAB 无法接受的代码。

  • 对于不等比较,Octave 可以使用 '~=' 或 '!='。MATLAB 需要 '~='。

GNU Octave 控制包

[编辑 | 编辑源代码]

MATLAB 和 Octave 都有用于控制系统设计的工具箱。在 Octave 中,该工具箱称为 Octave 控制包。可以通过在 Octave 提示符下使用命令 pkg install control 下载、编译和安装该包。Debian 及其衍生版本的用户可以通过安装“octave-control”包来安装它,如果它不是默认安装的。

有关函数语法的更多信息,请键入help <函数名称>。有关控制包的更多信息,请查看包的“doc”文件夹中的 PDF 手册。

存在细微的差异 - 例如 c2d。以下是使用模拟模型 C 的双线性变换的两种格式

* discrete = c2d(C,0.5,'tustin');   % Matlab
* discrete = c2d(C,0.5,'bi');       % GNU Octave

其他一些差异

[编辑 | 编辑源代码]
  • MATLAB 使用百分号 '%' 开始注释。Octave 交换使用井号 # 和百分号 %
  • 对于求幂运算,Octave 可以使用 ^**;MATLAB 需要 ^
  • 要结束块,Octave 可以使用 end 或使用 endif, endfor, ... 指定块;MATLAB 需要 end
  • Octave 支持 C 样式的十六进制表示法(例如“0xF0”);MATLAB 需要 hex2dec 函数(例如“hex2dec('F0')”)。
  • 如果某些内容(如 Netlab)需要名为 fcnchk 的函数,请创建一个名为 fcnchk.m 的文件,其中包含下面显示的内容,并将其放在 Octave 可以找到的位置。
 function f=fcnchk(x, n)
   f = x;
 end
  • 主要区别在于 Octave 缺少 GUI。在 4.0 版中,Octave 以 GUI 作为其默认界面。

关于特定函数的说明

[编辑 | 编辑源代码]
  • 对于“dbstep, in”,使用“dbstep”;对于“dbstep”,使用“dbnext”。
  • 对于“eig(A,B)”,使用“qz(A,B)”。
  • fputs() 函数在 MATLAB 中不可用。请改用 fprintf()
  • strftime() 函数在 MATLAB 中不可用。请改用 datestr()
  • time() 函数在 MATLAB 中不可用。请改用 now()
  • 从 4.2.1 开始,Octave 不会将输出打印到控制台,直到它完成所有等待的命令,这与 MATLAB 不同。此行为由布尔变量 page_output_immediately(默认值:0)控制,并且在 --traditional 中没有得到改善。
  • Octave 3.4.0 中的 strread()textscan() 函数与其在 MATLAB 2009b(以及可能以后的版本)中的实现不完全兼容。例如,N=-1 选项(重复读取格式直到字符串结束)在 Octave 3.4.0 中未实现。使用 N=正整数(读取格式 N 次)的值确实与 MATLAB 中的效果相同。
  • textscan() 函数未包含在 3.4.0 之前的 Octave 版本中。请改用 fscanf()
  • 对于 linprog() 函数,MATLAB 允许“a”和“b”输入为行向量或列向量,因此更加宽松。Octave 要求它们为列向量。
  • 在 Octave 中,可以使用 plot() 函数指定数据标签(或图例),而在 MATLAB 中,只能使用 legend() 函数。
Octave:        plot(x, y, ';label;')
MATLAB/Octave: plot(x, y); legend('label')
  • 如果消息为空,则 MATLAB 中的 error(msg) 函数为无操作。在 Octave 中,会导致错误。
  • contains() 函数在 Octave 中不可用。请改用 ~isempty(strfind())

参考文献

[编辑 | 编辑源代码]

另请参阅

[编辑 | 编辑源代码]
华夏公益教科书