MATLAB 编程/Octave 和 MATLAB 之间的差异
Octave 主要是在 MATLAB 兼容性的前提下构建的。它与 MATLAB 具有许多共同的功能
- 矩阵作为基本数据类型。
- 内置支持复数。
- 强大的内置数学函数和广泛的函数库。
- 以用户定义函数的形式进行扩展。
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 之间不同事物的差异说明。
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
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'] 现在在 Octave 和 MATLAB 中都允许;(MATLAB 之前会返回:?? Error using ==> vertcat)
在 Octave 和 MATLAB 中,结果将是一个 2x3 矩阵。
“! 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'
Octave 支持 printf
和 fprintf
作为打印到屏幕的命令。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);
此示例还展示了如何在运行时检测解释器。
Octave 允许用户对布尔值使用 ~ 和 !。第一个是为了与 MATLAB 兼容,而 ! 对 C/Java/等程序员来说会更熟悉。但是,如果您使用后者,您将编写 MATLAB 无法接受的代码。
- 对于不等比较,Octave 可以使用 '~=' 或 '!='。MATLAB 需要 '~='。
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())。