Matlab 基礎知識-5

函式 (Functions)

Functions 的中文翻譯依照地域不同,稱呼也就不同,有人稱它為函數、也有人稱為函式,但是在這裡我比較習慣依照數學上的定義來做出區別,所以在這裡 Functions 的中文稱呼我稱為函式,因為它是由一連串電腦命令語言所組合。

函數與函式數學上的定義
函數:表示每個輸入值對應的唯一輸出值。
函式:表示一連串的命令組合。

在 Matlab 中 m-File 第一個可以執行命令語句以 Functions 做起始,這份文件我們就稱它為 Functions File,每一份文件都定義了一個 Functions,而一個 Functions File 只能有一個主函式 (main-Function),而在這份文件裡面的其他函式,我們稱呼他為局部函式 (local-Function),它們能以任意排序出現在 main-Function 後面,但是 local-Function 只能被這份文件中的其他函式呼叫,而不能被其他文件中的函式所呼叫。

Info

在 Matlab 中的局部函式 (local-Function),等同於其他程式的子函式 (sub-Function),但是在 Matlab 官方文件中並沒有 sub-Function 的說法。

建立 Functions File 的注意事項

  1. main-Function 名稱需要與檔名相同。
  2. main-Function 可以被其他文件的函式所呼叫。
  3. local-Function 只能被同一份文件內的其他函式所呼叫。
  4. local-Function 的作用僅受限於所在的文件內,其他文件的函式都沒辦法呼叫這個函式。
  5. local-Function 通常作為 main-Functions 的「工具」所使用。

main-Function

每一個 Functions File 都定義了一個函式,而 main-Functions 位於這份文件的第一句敘述,它定義了這份 Functions File 的名稱 (與文件名相同) 與引數 (輸入引數或輸出引數),通常也會在下方註解說明這份Functions File 的作用與使用方式,以下為 Functions File 的基本架構。

  • 第一行為函式聲明,說明該函式名稱以及它的輸入引數 (Input Arguments) 與輸出引數 (Output Arguments),該函數接受輸入 in1, in2, …, 並反饋輸出 out1, out2, …。

Warning

請務必注意 Input Arguments ( ) 與 Output Arguments [ ] 所分別使用的括號種類。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
% 如果函式只反饋一個輸出,則在 function 關鍵字後面直接指定輸出名稱
function myOutput = myFunction(x)

% 如果函式會反饋多個輸出,則將輸出名稱括在方括號中
function [one,two,three] = myFunction(x)

% 如果沒有反饋,則可以將其忽略
function myFunction(x)

% 也可以使用空的方括號
function [] = myFunction(x)

% 如果沒有輸入,可以忽略圓括號
function myOutput = myFunction
  • 有效的 Functions 名字遵守與 Variable 名稱相同的規則,它們必須以字母開頭,可以包含字母、數字或下劃線的任意組合,但是不能超過 31 個字元。
  • 在函式宣告 function 之後的第一列註解,稱為 H1 註解,念成 H-one line,做 Functions 功能的簡述,它必須只包含一行註解文字,用以表明整個函式的目的,此行文字的意義在於可讓 MATLAB 藉由 lookfor 指令搜尋並顯示此函式用途。
  • 第三行開始做 Functions 的詳述(可註釋多行使用),說明輸入與輸出引數的定義,如何使用這個 Functions。
    • 第四行做為函式的主體。
  • 在最後一行的 end 說明這個 Functions 的結束,有時亦可省略 (但不建議)。

以下為範例說明

1
2
3
4
5
6
7
function normalplot(mu, sd) % 說明這個 Functions 的起始,並做定義,其中 normalplot 為這個 Functions 的名稱,與 m-File 同名 e.g. normalplot.m
%H1 This is Functions test. (故意不空格做分辨)
% Detailed explanation goes here
x = linspace (mu-3*sd, mu+3*sd, 100); % 參閱 linspace 函式說明
y = normpdf (x, mu, sd); % 參閱 normpdf 函式說明
plot(x, y) % 畫出圖形
end % 說明這個 Functions 的終止

以下為範例實際運用
在 Command Window 輸入指令 normalplot (100, 15),即可利用這個 Functions 畫出一個簡單的常態分佈圖。

local-Function

local-Function 是位於 main-Function 後面的 Functions,它們能以任意順序排列出現在 main-Function 後面,以下為範例說明。

  • 每個 local-Function 第一行為函式的聲明,其定義與 main-Function 是一致的 (僅差在 main-Function 的命名與 m-File 需使用一樣的名稱)。
  • 在 m-File 中,main-Function 的位置不能任意改變,而 local-Function 可任意改變。
  • local-Function 只能被這份 m-File 中的其他函式呼叫 (包含主函式),而不能被其他文件中的函式所呼叫。
  • 在同一份 m-File 中,任何對這份檔案的 local-Function 所呼叫的指令,其優先等級僅次於 Matlab 內建函式。
  • 在同一份 m-File 中, main-Function 與 local-Function 的工作區域都是彼此獨立,不會互相干擾,各個函式的訊息傳遞可以透過輸入/輸出的引數、全域變數或跨空間的指令來實現。
  • 在 Command Window 中,無法用 helplookfor 等指令來顯示 local-Function 的任何訊息。

Nested Functions

Nested Functions 是 local-Function 的延伸題,它以一種分層結構排列的方式,寄宿存於另一個函式之中,以下為範例說明。

  • 它的名稱只能被所嵌入的 Parent Function,或是在同一個 Parent Function 內的其他 Nested Functions 所呼叫。
  • 一個 Nested Functions 可以存取、修改在其函式內部所有 Variables,以及在 Parent Function 裡的任何 Variables。
  • 而 Nested Functions 定義的 Variables,在 Parent Function 中或是其他 Nested Function 中,是無法被呼叫的;Nested Functions 中所定義的 Variables 都是獨立不被其他 Functions 干涉。
  • 當 Nested Functions 的 Variables 與 Parent Function 的 Variables 同名時,Parent Function 的 Variables 會無法存取。
  • 如果一個檔案擁有一個或多個 Nested Functions 時,每一個函式都必須使用一個 end 來宣告函式的結束。
  • 這是在 Matlab 中唯一強制要求要設置 end 來宣告一個 Function 的結束。

Private Functions

  • Private Functions 是儲存在於特定子目錄下的函式
  • Private Functions 所放置的文件夾擁有特別名稱「Private」
  • 它只能被 Private 文件夾或是上一級目錄或文件夾的其他函式所呼叫
  • 通常被呼叫的 (子) 函式均放置於 Private 子目錄內,而主程序檔或是主要函式存放於其上一級目錄或文件夾中。

以下為範例
在主目錄下建立一個 Private 文件夾,並創建一個 findme 函式,其內容如下。

1
2
3
4
function findme
% FINDME 是一個自訂範例名稱
disp('You found the private function.')
end

於主目錄中創立一個 visible 函式的文件,其內容如下。

1
2
function visible
findme

於同一主目錄下,在 Command window 輸入指令 visible,會出現以下內容。

1
2
>> visible
You found the private function. %會導出 findme 函式的內容

離開主目錄至其他資料夾,再次於 Command window 輸入指令 visible,會出現以下內容。

1
2
3
4
>> visible
'visible' is not found in the current folder or on the MATLAB path, but exists in:
/Users/*/Documents/Program/Matlab
Change the MATLAB current folder or add its folder to the MATLAB path. % 代表函式呼叫失敗

Anonymous Function

匿名函式 (Anonymous Function) 是一種沒有名稱的 Functions,它是用單一行 Matlab 敘述所宣告的 Functions,而且會回傳一 Function Handle,然後可以用此 Function Handle 來執行此函式,它可以在 Command Window 裡直接定義一個 Anonymous Function,而不用把 Function 寫 在 m-File 裡,以下是 Anonymous Function 基本架構。

以下為一個自定義的簡單 Anonymous Function。

1
2
3
4
>> sqr = @(n) n^2;						%建立 Anonymous Function
>> x = sqr(3) %引用 Anonymous Function
x =
9