跳轉到內容

MATLAB 程式設計/指令碼

來自華夏公益教科書,開放的書籍,開放的世界


有兩種型別的 M 檔案

  • 指令碼
  • 函式

指令碼是 M 檔案的一種型別,它在當前工作空間中執行。因此,如果您從命令列(基本工作空間)呼叫指令碼,該指令碼將使用和操作基本工作空間的變數。這會變得非常混亂,並在迴圈涉及時以及編碼器懶於命名其迴圈變數(例如,對於 i = 1:10,如果每個迴圈都使用 i、j 或 k,那麼很可能從迴圈呼叫的任何指令碼都會改變迴圈變數)。

函式完全包含在自身中。它們擁有自己的工作空間,保持工作空間分離。這意味著特定函式所需的所有變數都必須以某種方式傳遞或定義。對於需要大量變數的複雜演算法來說,這可能很乏味。但是,當函式退出時,對變數的所有操作都會被丟棄。只有函式提供的那些輸出引數可用於呼叫工作空間。這意味著迴圈可以使用 i、j 或 k 隨意,因為函式的工作空間和呼叫工作空間不會混淆。

任何在命令列有效的命令在任何 M 檔案中都有效,只要 M 檔案的操作工作空間中存在必要的變數。

正確使用函式可以對任何演算法或繪圖工具進行任何更改。這允許自動化重複性任務。

在 M 檔案末尾使用 'end' 是可選的;但是,這樣做如果程式碼中有條件語句或迴圈,或者如果計劃在同一個檔案中使用多個函式,可能會導致複雜情況(有關此內容的詳細資訊,請參閱巢狀函式)。

函式的要求

[編輯 | 編輯原始碼]

自定義函式以其最基本的形式遵循以下語法

function [output1, output2, ...]= function_name(input_arg1,input_arg2)
        statements
return;

在當前版本的 MATLAB 中,return; 行不是必需的。function_name 可以是您喜歡的任何名稱,但最好是 M 檔案的名稱為 function_name.m。從命令列或另一個 M 檔案呼叫該函式是透過使用函式的 M 檔名以及必要的輸入和輸出引數來完成的。

在函式本身內,必須有一個語句來定義每個輸出引數(output1、output2 等)。如果沒有一些宣告,輸出引數的變數在函式的工作空間中不存在。這會導致關於“一個或多個輸出引數”的錯誤。在函式開始時初始化輸出引數是一個好習慣。

通常,輸出引數被初始化為空 ([]) 或 0 或 -1 或其他資料型別的等效值。原因是,如果函式遇到預期的錯誤,則函式可以返回(透過 return 命令)這些預設值。如果初始化值是無效值,那麼呼叫函式可以輕鬆地檢查任何可能不會丟擲 MATLAB 錯誤的錯誤。

為了呼叫函式,該函式的 M 檔案必須在當前路徑中。可以透過檔案選單或 addpath 命令設定一個預設路徑。路徑的順序很重要,因為 MATLAB 按順序搜尋路徑並在找到該 M 檔名的第一個例項後停止搜尋。

當前路徑是

  • 當前目錄(可以在 MATLAB 視窗頂部看到或透過在命令提示符下鍵入 pwd 來檢視)
  • 預設路徑

請注意,MATLAB 始終在搜尋任何其他路徑之前搜尋當前目錄。

nargin & nargout

[編輯 | 編輯原始碼]

narginnargout 命令僅在函式內部有效,因為指令碼不會傳遞任何引數。nargin 命令返回傳遞的輸入引數的數量。這與 nargchk 結合使用非常有用

 nargchk(min, max, nargin)

其中 min 是函式執行所需的最小引數數量,max 是有效輸入引數的最大數量。

nargout 命令用於確定要返回的輸出引數。通常,輸出是某些演算法的最終結果,並且很容易計算。但是,在某些情況下,次要輸出引數可能很耗時才能計算出來,或者需要比主要輸出引數更多的輸入引數。因此,函式可以透過 nargout 命令檢查請求的輸出引數的數量。如果呼叫者沒有儲存次要輸出引數,那麼就不需要計算它們。

varargin & varargout

[編輯 | 編輯原始碼]

使用 MATLAB 物件和函式時,它們通常允許使用者設定屬性。函式和物件附帶了這些屬性的預設值,但使用者可以覆蓋這些預設值。這是透過使用 varargin 來實現的。varargin 是一個元胞陣列,通常在 varargin{i} 是一個屬性,varargin{i+1} 是使用者希望該屬性的值的情況下進行解析。解析是使用 forwhile 迴圈和 switch 語句完成的。

 function [out] = myFunc(in, varargin)

varargout 輸出引數選項允許可變數量的輸出引數,就像 varargin 允許可變數量的輸入引數一樣。從MATLAB 網站

 function [s,varargout] = mysize(x)
 nout = max(nargout,1)-1;
 s = size(x);
 for k=1:nout, varargout(k) = {s(k)}; end

返回大小向量,以及可選的單個大小。因此

 [s,rows,cols] = mysize(rand(4,5));

返回 s = [4 5],rows = 4,cols = 5。

有用的語法指南

[編輯 | 編輯原始碼]

在每行程式碼後放置分號符號告訴編譯器不要將該行程式碼放在命令提示符中,然後執行。這可以使您的程式執行得更快。此外,在每行程式碼後放置分號有助於除錯過程。

syms x y z;
w=[x y z];
e=[1 2 3];
t=jacobian(e,w);

在程式碼中放置註釋可以幫助其他人(以及您自己)理解程式碼變得越來越複雜時的程式碼。

syms x y z;                 %syms command makes x y and z symbolic
w=[x y z];
e=[1 2 3];
t=jacobian(e,w);

註釋還可以識別誰編寫了程式碼以及他們何時編寫了程式碼。

%Some code writer
%mm/dd/yyyy 

有關此內容的更多詳細資訊,請參閱“註釋”部分。

巢狀函式

[編輯 | 編輯原始碼]
Clipboard

待辦
編寫有關巢狀函式的內容,包括它們的優缺點


[編輯 | 編輯原始碼]

本頁面大部分內容來自ControlTheoryPro.com 的 M 檔案頁面指令碼,以及函式

華夏公益教科書