跳轉到內容

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

參考文獻

[編輯 | 編輯原始碼]

另請參閱

[編輯 | 編輯原始碼]
華夏公益教科書