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())。