• 沒有找到結果。

Chapter 6 基本的使用者定義函式

N/A
N/A
Protected

Academic year: 2022

Share "Chapter 6 基本的使用者定義函式"

Copied!
122
0
0

加載中.... (立即查看全文)

全文

(1)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

Chapter 6

基本的使用者定義函式

Hung-Yuan Fan (范洪源)

Department of Mathematics, National Taiwan Normal University, Taiwan

Spring 2020

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 1/53

(2)

使用者定義函式 (基礎篇)

L1 MATLAB 函式介紹

L2 MATLAB 的變數傳遞方式: 按值傳遞 L3 函式握把

L4 匿名函式

(3)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

Lecture 1

MATLAB 函式介紹

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 3/53

(4)

M 檔案的類型

儲存 MATLAB 程式碼的檔案稱為 M 檔案 (副檔名是.m),包含

1 程序檔案或稱底稿檔案(script files)

它是由一系列宣告式所組成的檔案。

執行結果如同把所有的指令直接鍵入指令視窗一樣。

任何由程序檔所產生的變數,都會繼續存留在工作區內而互 相影響。

2 MATLAB 函式 (MATLAB functions)

一種特殊類型的 M 檔案,可在自己專屬的工作區內執行。 藉由輸入引數清單(input argument list)接受輸入資料。 經由輸出引數清單(output argument list)傳回計算結果 給呼叫的程式。

在函式內使用的變數是區域變數(local variable),因此即 使工作區內已使用相同名稱的變數,它們彼此之間不會混 淆。

(5)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

M 檔案的類型

儲存 MATLAB 程式碼的檔案稱為 M 檔案 (副檔名是.m),包含

1 程序檔案或稱底稿檔案(script files)

它是由一系列宣告式所組成的檔案。

執行結果如同把所有的指令直接鍵入指令視窗一樣。

任何由程序檔所產生的變數,都會繼續存留在工作區內而互 相影響。

2 MATLAB 函式 (MATLAB functions)

一種特殊類型的 M 檔案,可在自己專屬的工作區內執行。

藉由輸入引數清單(input argument list)接受輸入資料。

經由輸出引數清單(output argument list)傳回計算結果 給呼叫的程式。

在函式內使用的變數是區域變數(local variable),因此即 使工作區內已使用相同名稱的變數,它們彼此之間不會混 淆。

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 4/53

(6)

函式的架構

完整的函式包括函式定義列、H1 列(唸成 H-one line)、

函式說明文字區,以及函式的主體四個部分。

function

[out1,out2,. . .] =

filename(in1,in2,. . .)

% H1 comment line

% Other comment lines

· · ·

(Executable code)

· · ·

(return) % 可省略此宣告式

end

% 有時亦可省略此宣告式

function

標示了函式的起點,它指明了函式名稱,以及輸

入與輸出引數清單。

儲存函式的檔名必須是

filename.m

,與函式名稱的英文大 小寫一致!

(7)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

函式的架構

完整的函式包括函式定義列、H1 列(唸成 H-one line)、

函式說明文字區,以及函式的主體四個部分。

function

[out1,out2,. . .] =

filename(in1,in2,. . .)

% H1 comment line

% Other comment lines

· · ·

(Executable code)

· · ·

(return) % 可省略此宣告式

end

% 有時亦可省略此宣告式

function

標示了函式的起點,它指明了函式名稱,以及輸

入與輸出引數清單。

儲存函式的檔名必須是

filename.m

,與函式名稱的英文大 小寫一致!

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 5/53

(8)

H1 Comment Line

在函式宣告function之後的第一列註解,稱為 H1 註解行

(H1 comment line)。

它必須只包含一行註解文字,用以表明整個函式的目的。 此行文字的特別意義,是讓 MATLAB 藉由 lookfor 指令 搜尋並顯示此函式用途。

語法: lookfor

keyword

MATLAB 會搜尋函式名稱或是 H1 列中是否包含該關鍵字

keyword

,並將所有搜尋結果顯示於指令視窗。

(9)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

H1 Comment Line

在函式宣告function之後的第一列註解,稱為 H1 註解行

(H1 comment line)。

它必須只包含一行註解文字,用以表明整個函式的目的。

此行文字的特別意義,是讓 MATLAB 藉由 lookfor 指令 搜尋並顯示此函式用途。

語法: lookfor

keyword

MATLAB 會搜尋函式名稱或是 H1 列中是否包含該關鍵字

keyword

,並將所有搜尋結果顯示於指令視窗。

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 6/53

(10)

H1 Comment Line

在函式宣告function之後的第一列註解,稱為 H1 註解行

(H1 comment line)。

它必須只包含一行註解文字,用以表明整個函式的目的。

此行文字的特別意義,是讓 MATLAB 藉由 lookfor 指令 搜尋並顯示此函式用途。

語法: lookfor

keyword

MATLAB 會搜尋函式名稱或是 H1 列中是否包含該關鍵字

keyword

,並將所有搜尋結果顯示於指令視窗。

(11)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

H1 列和註解說明文字 (1/2)

範例: 函式 vec_plus.m

function

total =

vec_plus(x,y)

% vec_plus Sum of two numbers or vectors.

% vec_plus(X,Y) computes X+Y and returns the result,

% where X and Y can be scalars or vectors.

% function's body starts here total = x + y;

>> vec_plus(2,ones(2,1)) ans =

3 3

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 7/53

(12)

H1 列和註解說明文字 (1/2)

範例: 函式 vec_plus.m

function

total =

vec_plus(x,y)

% vec_plus Sum of two numbers or vectors.

% vec_plus(X,Y) computes X+Y and returns the result,

% where X and Y can be scalars or vectors.

% function's body starts here total = x + y;

>> vec_plus(2,ones(2,1)) ans =

3 3

(13)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

H1 列和註解說明文字 (2/2)

>> help

vec_plus

vec_plus Sum of two numbers or vectors.

vec_plus(X,Y) computes X+Y and returns the result, where X and Y can be scalars or vectors.

>> lookfor

sum

vec_plus - Sum of two numbers or vectors.

reciproc_sum - Function-valued tensor for 1/(xi_1 + ... + xi_d) StatisticsByGroupMapReduceExample - Compute Summary Statistics by Group Using

MapReduce

summer - Shades of green and yellow colormap

uiresume - Resume execution of blocked MATLAB code. .. .

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 8/53

(14)

H1 列和註解說明文字 (2/2)

>> help

vec_plus

vec_plus Sum of two numbers or vectors.

vec_plus(X,Y) computes X+Y and returns the result, where X and Y can be scalars or vectors.

>> lookfor

sum

vec_plus - Sum of two numbers or vectors.

reciproc_sum - Function-valued tensor for 1/(xi_1 + ... + xi_d) StatisticsByGroupMapReduceExample - Compute Summary Statistics by Group Using

MapReduce

summer - Shades of green and yellow colormap

uiresume - Resume execution of blocked MATLAB code.

.. .

(15)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

函式的引數與傳回值

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 9/53

(16)

多個輸出引數的函式

範例: 函式 vec_minmax.m

function

[mn, mx] =

vec_minmax(v)

% vec_minmax 找出向量元素的最小值與最大值。

% 函式 vec_minmax(v) 計算向量 v 所有元素的最小值 mn

% 和最大值 mx,並且傳回這兩個輸出引數。

mn = min(v);

mx = max(v);

>> [min_val, max_val] = vec_minmax([4, -5, 7, 1]) min_val =

-5 max_val =

7

(17)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

多個輸出引數的函式

範例: 函式 vec_minmax.m

function

[mn, mx] =

vec_minmax(v)

% vec_minmax 找出向量元素的最小值與最大值。

% 函式 vec_minmax(v) 計算向量 v 所有元素的最小值 mn

% 和最大值 mx,並且傳回這兩個輸出引數。

mn = min(v);

mx = max(v);

>> [min_val, max_val] = vec_minmax([4, -5, 7, 1]) min_val =

-5 max_val =

7

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 10/53

(18)

查詢此函式的線上說明內容

>> help

vec_minmax

vec_minmax 找出向量元素的最小值與最大值。

函式 vec_minmax(v) 計算向量 v 所有元素的最小值 mn 和最大值 mx,並且傳回這兩個輸出引數。

>> lookfor

最小值

vec_minmax

- 找出向量元素的最小值與最大值。

>>

(19)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

查詢此函式的線上說明內容

>> help

vec_minmax

vec_minmax 找出向量元素的最小值與最大值。

函式 vec_minmax(v) 計算向量 v 所有元素的最小值 mn 和最大值 mx,並且傳回這兩個輸出引數。

>> lookfor

最小值

vec_minmax

- 找出向量元素的最小值與最大值。

>>

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 11/53

(20)

不需要括號的函式呼叫方式

函式如果沒有輸出引數,就不需要將輸入的引數括起來。

例如,如果 my_func(a, b) 沒有輸出引數,可用下面兩種方 法呼叫:

my_func(a, b); % 需要括號的呼叫方式

my_func

a b; % 不需括號的呼叫: 將 a、b 視為字串

範例: 函式 axis 的使用方式

axis([-4, 4, 0, 20]); % 輸入引數是 double 型態的向量 axis

on;

% 效果和 axis('on') 一樣

axis

off; % 效果和 axis('off') 一樣

(21)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

不需要括號的函式呼叫方式

函式如果沒有輸出引數,就不需要將輸入的引數括起來。

例如,如果 my_func(a, b) 沒有輸出引數,可用下面兩種方 法呼叫:

my_func(a, b); % 需要括號的呼叫方式

my_func

a b; % 不需括號的呼叫: 將 a、b 視為字串

範例: 函式 axis 的使用方式

axis([-4, 4, 0, 20]); % 輸入引數是 double 型態的向量 axis

on; % 效果和 axis('on') 一樣

axis

off; % 效果和 axis('off') 一樣

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 12/53

(22)

沒有輸出引數的範例 (檔名: no_outarg.m)

function

no_outarg(x, y)

fprintf(' 輸入引數分別是%s 和

%s \n',x, y);

>> no_outarg

2 -10

輸入引數分別是 2 和 -10

>> no_outarg(2, -10) 輸入引數分別是 和

>> no_outarg('2',

'-10')

輸入引數分別是 2 和 -10

(23)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

沒有輸出引數的範例 (檔名: no_outarg.m)

function

no_outarg(x, y)

fprintf(' 輸入引數分別是%s 和

%s \n',x, y);

>> no_outarg

2 -10

輸入引數分別是 2 和 -10

>> no_outarg(2, -10) 輸入引數分別是 和

>> no_outarg('2',

'-10')

輸入引數分別是 2 和 -10

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 13/53

(24)

沒有輸出引數的範例 (檔名: no_outarg.m)

function

no_outarg(x, y)

fprintf(' 輸入引數分別是%s 和

%s \n',x, y);

>> no_outarg

2 -10

輸入引數分別是 2 和 -10

>> no_outarg(2, -10) 輸入引數分別是 和

>> no_outarg('2',

'-10')

輸入引數分別是 2 和 -10

(25)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

沒有輸出引數的範例 (檔名: no_outarg.m)

function

no_outarg(x, y)

fprintf(' 輸入引數分別是%s 和

%s \n',x, y);

>> no_outarg

2 -10

輸入引數分別是 2 和 -10

>> no_outarg(2, -10) 輸入引數分別是 和

>> no_outarg('2',

'-10')

輸入引數分別是 2 和 -10

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 13/53

(26)

Lecture 2

MATLAB 的變數傳遞方式: 按值傳遞

(27)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

按值傳遞與按址傳遞

MATLAB 程式使用按值傳遞(pass-by-value)的方式,進 行程式與函式間的溝通。

C 語言是採取按址傳遞(pass-by-address)的方式,進行程 式與函式間的溝通。

當程式呼叫函式時,MATLAB 便複製實際引數,並傳遞這 些實際引數的備份給函式使用。

即使函式更改了輸入引數值,也不會影響到呼叫程式的原始 資料。

這種特點可防止在函式中因產生某個錯誤,而無意間修改到 呼叫程式的原始變數值。

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 15/53

(28)

按值傳遞與按址傳遞

MATLAB 程式使用按值傳遞(pass-by-value)的方式,進 行程式與函式間的溝通。

C 語言是採取按址傳遞(pass-by-address)的方式,進行程 式與函式間的溝通。

當程式呼叫函式時,MATLAB 便複製實際引數,並傳遞這 些實際引數的備份給函式使用。

即使函式更改了輸入引數值,也不會影響到呼叫程式的原始 資料。

這種特點可防止在函式中因產生某個錯誤,而無意間修改到 呼叫程式的原始變數值。

(29)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

按值傳遞與按址傳遞

MATLAB 程式使用按值傳遞(pass-by-value)的方式,進 行程式與函式間的溝通。

C 語言是採取按址傳遞(pass-by-address)的方式,進行程 式與函式間的溝通。

當程式呼叫函式時,MATLAB 便複製實際引數,並傳遞這 些實際引數的備份給函式使用。

即使函式更改了輸入引數值,也不會影響到呼叫程式的原始 資料。

這種特點可防止在函式中因產生某個錯誤,而無意間修改到 呼叫程式的原始變數值。

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 15/53

(30)

按值傳遞與按址傳遞

MATLAB 程式使用按值傳遞(pass-by-value)的方式,進 行程式與函式間的溝通。

C 語言是採取按址傳遞(pass-by-address)的方式,進行程 式與函式間的溝通。

當程式呼叫函式時,MATLAB 便複製實際引數,並傳遞這 些實際引數的備份給函式使用。

即使函式更改了輸入引數值,也不會影響到呼叫程式的原始 資料。

這種特點可防止在函式中因產生某個錯誤,而無意間修改到 呼叫程式的原始變數值。

(31)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

函式 sample.m

function out = sample(a,b)

fprintf('In sample: a = %f, b = %f

\n',a,b);

a = b(1) + 2*a;

b = a .* b;

out = a + b(1);

fprintf('In sample: a = %f, b = %f

\n',a,b);

呼叫上述函式的主程式 test_sample.m a = 2; b = [6 4];

fprintf('Before sample: a = %f, b = %f

\n',a,b); out = sample(a,b);

fprintf('After sample: a = %f, b = %f

\n',a,b);

fprintf('After sample: out = %f

\n',out);

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 16/53

(32)

函式 sample.m

function out = sample(a,b)

fprintf('In sample: a = %f, b = %f

\n',a,b);

a = b(1) + 2*a;

b = a .* b;

out = a + b(1);

fprintf('In sample: a = %f, b = %f

\n',a,b);

呼叫上述函式的主程式 test_sample.m a = 2; b = [6 4];

fprintf('Before sample: a = %f, b = %f

\n',a,b);

out = sample(a,b);

fprintf('After sample: a = %f, b = %f

\n',a,b);

fprintf('After sample: out = %f

\n',out);

(33)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

主程式的執行結果

>> test_sample

Before sample: a = 2.000000, b = 6.000000 4.000000

In sample: a = 2.000000, b = 6.000000 4.000000 In sample: a = 10.000000, b = 60.000000 40.000000

After sample: a = 2.000000, b = 6.000000 4.000000

After sample: out = 70.000000

>>

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 17/53

(34)

Lecture 3

函式握把

(35)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

MATLAB 的資料型態

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 19/53

(36)

何謂函式握把?

函式握把(function handle)是 MATLAB 的一種資料型 態,它保有呼叫一個函式所需的資訊。

MATLAB 提供兩種方法來產生函式握把:

1 使用@運算子來產生函式握把時,只需要將運算子放在函式 名稱前面即可。

fh = @函式名稱;

2 使用 str2func 產生函式握把時,必須將函式的名稱當成輸 入引數的字串。

fh = str2func('函式名稱');

(37)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

何謂函式握把?

函式握把(function handle)是 MATLAB 的一種資料型 態,它保有呼叫一個函式所需的資訊。

MATLAB 提供兩種方法來產生函式握把:

1 使用@運算子來產生函式握把時,只需要將運算子放在函式 名稱前面即可。

fh = @函式名稱;

2 使用 str2func 產生函式握把時,必須將函式的名稱當成輸 入引數的字串。

fh = str2func('函式名稱');

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 20/53

(38)

何謂函式握把?

函式握把(function handle)是 MATLAB 的一種資料型 態,它保有呼叫一個函式所需的資訊。

MATLAB 提供兩種方法來產生函式握把:

1 使用@運算子來產生函式握把時,只需要將運算子放在函式 名稱前面即可。

fh = @函式名稱;

2 使用 str2func 產生函式握把時,必須將函式的名稱當成輸 入引數的字串。

fh = str2func('函式名稱');

(39)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

函式握把的範例 (1/2)

使用者定義的函式: my_func.m

function

y = my_func(x) y = x.^2 - 2*x + 1;

>> fh1 = @my_func; % 宣告 fh1 為一個函式握把

>> [fh1(4), my_func(4)] ans =

9 9

>> fh2 = @randn;

>> fh2() % 若沒有輸入引數時,必須加上圓括弧 () ans =

-0.1241

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 21/53

(40)

函式握把的範例 (1/2)

使用者定義的函式: my_func.m

function

y = my_func(x) y = x.^2 - 2*x + 1;

>> fh1 = @my_func; % 宣告 fh1 為一個函式握把

>> [fh1(4), my_func(4)] ans =

9 9

>> fh2 = @randn;

>> fh2() % 若沒有輸入引數時,必須加上圓括弧 () ans =

-0.1241

(41)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

函式握把的範例 (1/2)

使用者定義的函式: my_func.m

function

y = my_func(x) y = x.^2 - 2*x + 1;

>> fh1 = @my_func; % 宣告 fh1 為一個函式握把

>> [fh1(4), my_func(4)]

ans =

9 9

>> fh2 = @randn;

>> fh2() % 若沒有輸入引數時,必須加上圓括弧 () ans =

-0.1241

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 21/53

(42)

函式握把的範例 (1/2)

使用者定義的函式: my_func.m

function

y = my_func(x) y = x.^2 - 2*x + 1;

>> fh1 = @my_func; % 宣告 fh1 為一個函式握把

>> [fh1(4), my_func(4)]

ans =

9 9

>> fh2 = @randn;

>> fh2() % 若沒有輸入引數時,必須加上圓括弧 () ans =

-0.1241

(43)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

函式握把的範例 (2/2)

>> whos

Name Size Bytes Class ans 1

× 1 8

double

fh1 1

× 1 32

funciton_handle fh2 1

× 1 32

funciton_handle

>>> feval(fh1, 4) % 效果與 fh1(4) 相同 ans =

9

>> func2str(fh1) % 找回函式握把 fh1 的原函式名稱 ans =

my_func

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 22/53

(44)

函式握把的範例 (2/2)

>> whos

Name Size Bytes Class ans 1

× 1 8

double

fh1 1

× 1 32

funciton_handle fh2 1

× 1 32

funciton_handle

>>> feval(fh1, 4) % 效果與 fh1(4) 相同 ans =

9

>> func2str(fh1) % 找回函式握把 fh1 的原函式名稱 ans =

my_func

(45)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

函式握把的範例 (2/2)

>> whos

Name Size Bytes Class ans 1

× 1 8

double

fh1 1

× 1 32

funciton_handle fh2 1

× 1 32

funciton_handle

>>> feval(fh1, 4) % 效果與 fh1(4) 相同 ans =

9

>> func2str(fh1) % 找回函式握把 fh1 的原函式名稱 ans =

my_func

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 22/53

(46)

處理函式握把的 MATLAB 函式

(47)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

Lecture 4 匿名函式

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 24/53

(48)

匿名函式(anonymous function)是一個「沒有名稱」的函 式。

它是用單一行 MATLAB 敘述所宣告的函式,而且會回傳一 個函式握把,然後可以用此握把來執行此函式。

可以在指令視窗裡直接定義一個匿名函式,而不用把函式寫 在 M 檔案裡。

一般形式為

(49)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

匿名函式(anonymous function)是一個「沒有名稱」的函 式。

它是用單一行 MATLAB 敘述所宣告的函式,而且會回傳一 個函式握把,然後可以用此握把來執行此函式。

可以在指令視窗裡直接定義一個匿名函式,而不用把函式寫 在 M 檔案裡。

一般形式為

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 25/53

(50)

匿名函式(anonymous function)是一個「沒有名稱」的函 式。

它是用單一行 MATLAB 敘述所宣告的函式,而且會回傳一 個函式握把,然後可以用此握把來執行此函式。

可以在指令視窗裡直接定義一個匿名函式,而不用把函式寫 在 M 檔案裡。

一般形式為

(51)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

單自變量函數的範例

>> f = @(x) cos(x) - x; % 宣告 f 是一個函式握把

>> z =

fzero(f,[0,pi/2]) % 求出函數 f 的零根

z =

0.7391

>> x = linspace(0,pi/2); y = f(x); fz = f(z);

>> plot(x,y,'b-',x,zeros(size(x)),'k-',z,fz,'ro');

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 26/53

(52)

單自變量函數的範例

>> f = @(x) cos(x) - x; % 宣告 f 是一個函式握把

>> z =

fzero(f,[0,pi/2]) % 求出函數 f 的零根

z =

0.7391

>> x = linspace(0,pi/2); y = f(x); fz = f(z);

>> plot(x,y,'b-',x,zeros(size(x)),'k-',z,fz,'ro');

(53)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

雙自變量函數的範例

>> g = @(x,y) x./(x.^2+y.^2+1);

>> g(1,1) ans =

0.3333

>> ezsurf(g,[-5,5,-5,5]);

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 27/53

(54)

雙自變量函數的範例

>> g = @(x,y) x./(x.^2+y.^2+1);

>> g(1,1) ans =

0.3333

>> ezsurf(g,[-5,5,-5,5]);

(55)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

使用者定義函式 (進階篇)

L5 選擇性引數

L6 使用共用記憶體分享資料 L7 函式呼叫間的資料保存

L8 MATLAB 內建函式: 排序與亂數涵式

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 28/53

(56)

Lecture 5

選擇性引數

(57)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

許多 MATLAB 函式支援選擇性的輸入引數及輸出引數,例 如: plot、max 等函式。

x_max = max(x);

[x_max,ii_max] = max(x);

MATLAB 有關選擇性引數資訊的函式

nargin: 傳回用來呼叫函式的實際輸入引數數目,是 number of argument input 的縮寫。

nargout: 傳回用來呼叫函式的實際輸出引數數目,是 number of argument output 的縮寫。

nargchk: 假如用來呼叫函式的引數太少或是太多,將傳回 一個錯誤訊息。

error: 顯示錯誤的訊息,並放棄執行產生錯誤的函式。用 在當引數產生的錯誤是嚴重的 (fatal) 情況。

warning: 顯示警告的訊息,並繼續執行函式。用在當引數 的錯誤並不嚴重,而函式可以繼續執行的情況。

inputname: 傳回對應輸入引數清單特定次序的實際變數名 稱。

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 30/53

(58)

許多 MATLAB 函式支援選擇性的輸入引數及輸出引數,例 如: plot、max 等函式。

x_max = max(x);

[x_max,ii_max] = max(x);

MATLAB 有關選擇性引數資訊的函式

nargin: 傳回用來呼叫函式的實際輸入引數數目,是 number of argument input 的縮寫。

nargout: 傳回用來呼叫函式的實際輸出引數數目,是 number of argument output 的縮寫。

nargchk: 假如用來呼叫函式的引數太少或是太多,將傳回 一個錯誤訊息。

error: 顯示錯誤的訊息,並放棄執行產生錯誤的函式。用 在當引數產生的錯誤是嚴重的 (fatal) 情況。

warning: 顯示警告的訊息,並繼續執行函式。用在當引數 的錯誤並不嚴重,而函式可以繼續執行的情況。

inputname: 傳回對應輸入引數清單特定次序的實際變數名 稱。

(59)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

許多 MATLAB 函式支援選擇性的輸入引數及輸出引數,例 如: plot、max 等函式。

x_max = max(x);

[x_max,ii_max] = max(x);

MATLAB 有關選擇性引數資訊的函式

nargin: 傳回用來呼叫函式的實際輸入引數數目,是 number of argument input 的縮寫。

nargout: 傳回用來呼叫函式的實際輸出引數數目,是 number of argument output 的縮寫。

nargchk: 假如用來呼叫函式的引數太少或是太多,將傳回 一個錯誤訊息。

error: 顯示錯誤的訊息,並放棄執行產生錯誤的函式。用 在當引數產生的錯誤是嚴重的 (fatal) 情況。

warning: 顯示警告的訊息,並繼續執行函式。用在當引數 的錯誤並不嚴重,而函式可以繼續執行的情況。

inputname: 傳回對應輸入引數清單特定次序的實際變數名 稱。

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 30/53

(60)

許多 MATLAB 函式支援選擇性的輸入引數及輸出引數,例 如: plot、max 等函式。

x_max = max(x);

[x_max,ii_max] = max(x);

MATLAB 有關選擇性引數資訊的函式

nargin: 傳回用來呼叫函式的實際輸入引數數目,是 number of argument input 的縮寫。

nargout: 傳回用來呼叫函式的實際輸出引數數目,是 number of argument output 的縮寫。

nargchk: 假如用來呼叫函式的引數太少或是太多,將傳回 一個錯誤訊息。

error: 顯示錯誤的訊息,並放棄執行產生錯誤的函式。用 在當引數產生的錯誤是嚴重的 (fatal) 情況。

warning: 顯示警告的訊息,並繼續執行函式。用在當引數 的錯誤並不嚴重,而函式可以繼續執行的情況。

inputname: 傳回對應輸入引數清單特定次序的實際變數名 稱。

(61)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

許多 MATLAB 函式支援選擇性的輸入引數及輸出引數,例 如: plot、max 等函式。

x_max = max(x);

[x_max,ii_max] = max(x);

MATLAB 有關選擇性引數資訊的函式

nargin: 傳回用來呼叫函式的實際輸入引數數目,是 number of argument input 的縮寫。

nargout: 傳回用來呼叫函式的實際輸出引數數目,是 number of argument output 的縮寫。

nargchk: 假如用來呼叫函式的引數太少或是太多,將傳回 一個錯誤訊息。

error: 顯示錯誤的訊息,並放棄執行產生錯誤的函式。用 在當引數產生的錯誤是嚴重的 (fatal) 情況。

warning: 顯示警告的訊息,並繼續執行函式。用在當引數 的錯誤並不嚴重,而函式可以繼續執行的情況。

inputname: 傳回對應輸入引數清單特定次序的實際變數名 稱。

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 30/53

(62)

許多 MATLAB 函式支援選擇性的輸入引數及輸出引數,例 如: plot、max 等函式。

x_max = max(x);

[x_max,ii_max] = max(x);

MATLAB 有關選擇性引數資訊的函式

nargin: 傳回用來呼叫函式的實際輸入引數數目,是 number of argument input 的縮寫。

nargout: 傳回用來呼叫函式的實際輸出引數數目,是 number of argument output 的縮寫。

nargchk: 假如用來呼叫函式的引數太少或是太多,將傳回 一個錯誤訊息。

error: 顯示錯誤的訊息,並放棄執行產生錯誤的函式。用 在當引數產生的錯誤是嚴重的 (fatal) 情況。

warning: 顯示警告的訊息,並繼續執行函式。用在當引數 的錯誤並不嚴重,而函式可以繼續執行的情況。

inputname: 傳回對應輸入引數清單特定次序的實際變數名 稱。

(63)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

許多 MATLAB 函式支援選擇性的輸入引數及輸出引數,例 如: plot、max 等函式。

x_max = max(x);

[x_max,ii_max] = max(x);

MATLAB 有關選擇性引數資訊的函式

nargin: 傳回用來呼叫函式的實際輸入引數數目,是 number of argument input 的縮寫。

nargout: 傳回用來呼叫函式的實際輸出引數數目,是 number of argument output 的縮寫。

nargchk: 假如用來呼叫函式的引數太少或是太多,將傳回 一個錯誤訊息。

error: 顯示錯誤的訊息,並放棄執行產生錯誤的函式。用 在當引數產生的錯誤是嚴重的 (fatal) 情況。

warning: 顯示警告的訊息,並繼續執行函式。用在當引數 的錯誤並不嚴重,而函式可以繼續執行的情況。

inputname: 傳回對應輸入引數清單特定次序的實際變數名 稱。

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 30/53

(64)

上述函式的語法 (1/2)

nargchk 語法

msg = nargchk(min_args,max_args,num_args);

min_args: 引數最小數目,max_args: 引數最大數目,

num_args: 實際引數數目。

假使引數的數目不在可接受的範圍,將會產生一個標準的錯 誤訊息。

假使引數的數目在可接受範圍內,則函式將會傳回一個空字 串。

error 語法

error('msg'),其中 msg 是包含錯誤訊息的字串。 error 可與 nargchk 互相搭配使用。

當程式發生錯誤時,產生一個錯誤訊息並停止執行。 如果程式沒有錯誤,就只輸出一個空字串。

(65)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

上述函式的語法 (1/2)

nargchk 語法

msg = nargchk(min_args,max_args,num_args);

min_args: 引數最小數目,max_args: 引數最大數目,

num_args: 實際引數數目。

假使引數的數目不在可接受的範圍,將會產生一個標準的錯 誤訊息。

假使引數的數目在可接受範圍內,則函式將會傳回一個空字 串。

error 語法

error('msg'),其中 msg 是包含錯誤訊息的字串。

error 可與 nargchk 互相搭配使用。

當程式發生錯誤時,產生一個錯誤訊息並停止執行。

如果程式沒有錯誤,就只輸出一個空字串。

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 31/53

(66)

上述函式的語法 (2/2)

warning 語法

warning('msg'),其中 msg 是包含警告訊息的字串。

會告知使用者發生問題的函式名稱,以及程式發生問題的位 置,但程式仍繼續執行而不會中斷。

inputname 語法

name = inputname(argno);

會傳回所使用的真實引數名稱,其中 argno 是引數的序數。 如果引數是個變數,函式會傳回變數名稱。

假如引數是一段敘述,則會傳回一個空字串。

(67)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

上述函式的語法 (2/2)

warning 語法

warning('msg'),其中 msg 是包含警告訊息的字串。

會告知使用者發生問題的函式名稱,以及程式發生問題的位 置,但程式仍繼續執行而不會中斷。

inputname 語法

name = inputname(argno);

會傳回所使用的真實引數名稱,其中 argno 是引數的序數。

如果引數是個變數,函式會傳回變數名稱。

假如引數是一段敘述,則會傳回一個空字串。

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 32/53

(68)

範例: 使用選擇性引數

產生一個函式 pplar_value,將直角座標 (x, y) 轉換成等 價的極座標 (r, θ)。

如果只有輸入一個引數,則函式將會假設 y 值為 0,並繼 續完成轉換的計算。

正常的情況下,函式將傳回距離 r 與角度 θ(以度為單位) 兩個數值,但如果呼叫此函式的敘述式只有一個輸出引數,

它將只會傳回距離值 r。

(69)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

MATLAB 程式碼 (檔名: polar_value.m)

function

[mag,angle] = polar_value(x,y) msg = nargchk(1,2,nargin);

error(msg);

if

nargin < 2 y = 0;

end

if

x == 0 & y == 0

msg = 'x and y are zero: angle is meaningless!';

warning(msg);

end

mag = sqrt(x.^2 + y.^2);

if

nargout == 2

angle = atan2(y,x) * 180/pi;

end

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 34/53

(70)

程式執行結果 (1/2)

>> [r, theta] = polar_value(1, -1) r =

1.4142 theta =

-45

>> r = polar_value(1, -1) r =

1.4142

>> [r, theta] = polar_value(-2) r =

2 theta =

180

(71)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

程式執行結果 (1/2)

>> [r, theta] = polar_value(1, -1) r =

1.4142 theta =

-45

>> r = polar_value(1, -1) r =

1.4142

>> [r, theta] = polar_value(-2) r =

2 theta =

180

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 35/53

(72)

程式執行結果 (1/2)

>> [r, theta] = polar_value(1, -1) r =

1.4142 theta =

-45

>> r = polar_value(1, -1) r =

1.4142

>> [r, theta] = polar_value(-2) r =

2 theta =

(73)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

程式執行結果 (2/2)

>> [r, theta] = polar_value(3, 4) r =

5 theta =

53.1301

>> [r, theta] = polar_value(0, 0)

Warning: x and y are zero: angle is meaningless!

> In polar_value at 32

r =

0 theta =

0

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 36/53

(74)

程式執行結果 (2/2)

>> [r, theta] = polar_value(3, 4) r =

5 theta =

53.1301

>> [r, theta] = polar_value(0, 0)

Warning: x and y are zero: angle is meaningless!

> In polar_value at 32

r =

0 theta =

0

(75)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

Lecture 6

使用共用記憶體分享資料

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 37/53

(76)

共用記憶體與全域變數

除了引數清單之外,MATLAB 函式也能在工作區內使用

共 用記憶體,以交換彼此間的資料。

共用記憶體(global memory)是一種特別型態的記憶體, 能在任何工作區內存取。

對於分享函式間的大量資料特別有用,因為每次函式被呼叫 時,就不需要複製整個資料集合。

全域變數 (global variables) 是藉由 global 宣告來產生, 其宣告形式如下:

(77)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

共用記憶體與全域變數

除了引數清單之外,MATLAB 函式也能在工作區內使用

共 用記憶體,以交換彼此間的資料。

共用記憶體(global memory)是一種特別型態的記憶體,

能在任何工作區內存取。

對於分享函式間的大量資料特別有用,因為每次函式被呼叫 時,就不需要複製整個資料集合。

全域變數 (global variables) 是藉由 global 宣告來產生, 其宣告形式如下:

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 38/53

(78)

共用記憶體與全域變數

除了引數清單之外,MATLAB 函式也能在工作區內使用

共 用記憶體,以交換彼此間的資料。

共用記憶體(global memory)是一種特別型態的記憶體,

能在任何工作區內存取。

對於分享函式間的大量資料特別有用,因為每次函式被呼叫 時,就不需要複製整個資料集合。

全域變數 (global variables) 是藉由 global 宣告來產生, 其宣告形式如下:

(79)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

共用記憶體與全域變數

除了引數清單之外,MATLAB 函式也能在工作區內使用

共 用記憶體,以交換彼此間的資料。

共用記憶體(global memory)是一種特別型態的記憶體,

能在任何工作區內存取。

對於分享函式間的大量資料特別有用,因為每次函式被呼叫 時,就不需要複製整個資料集合。

全域變數 (global variables) 是藉由 global 宣告來產生,

其宣告形式如下:

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 38/53

(80)

區域變數與全域變數

在 MATLAB 函式內部的變數均是區域變數 (local variables)。

以大寫字母宣告全域變數,使其容易與區域變數區別。

通常在函式中的使用說明與第一個可執行的宣告式之間,宣 告所有的全域變數。

每個全域變數在函式內第一次使用前,必須先宣告其為全域 變數。如果在局部工作區產生一個變數後才宣告其為全域變 數,將會產生錯誤。

(81)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

區域變數與全域變數

在 MATLAB 函式內部的變數均是區域變數 (local variables)。

以大寫字母宣告全域變數,使其容易與區域變數區別。

通常在函式中的使用說明與第一個可執行的宣告式之間,宣 告所有的全域變數。

每個全域變數在函式內第一次使用前,必須先宣告其為全域 變數。如果在局部工作區產生一個變數後才宣告其為全域變 數,將會產生錯誤。

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 39/53

(82)

區域變數與全域變數

在 MATLAB 函式內部的變數均是區域變數 (local variables)。

以大寫字母宣告全域變數,使其容易與區域變數區別。

通常在函式中的使用說明與第一個可執行的宣告式之間,宣 告所有的全域變數。

每個全域變數在函式內第一次使用前,必須先宣告其為全域 變數。如果在局部工作區產生一個變數後才宣告其為全域變 數,將會產生錯誤。

(83)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

區域變數與全域變數

在 MATLAB 函式內部的變數均是區域變數 (local variables)。

以大寫字母宣告全域變數,使其容易與區域變數區別。

通常在函式中的使用說明與第一個可執行的宣告式之間,宣 告所有的全域變數。

每個全域變數在函式內第一次使用前,必須先宣告其為全域 變數。如果在局部工作區產生一個變數後才宣告其為全域變 數,將會產生錯誤。

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 39/53

(84)

全域變數的範例

使用 global 宣告的函式: test_global.m

function

test_global(num)

global

VAR; % 宣告 VAR 為一個全域變數 VAR = VAR * num; % 改變 VAR 的內存數值 fprintf(' 在函式內,VAR = %g

\n', VAR);

>>

global

VAR

>> VAR = 3.14;

>> test_global(-2) 在函式內,VAR = -6.28

>> num

Undefined function or variable 'num'.

>> VAR VAR =

-6.2800

(85)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

全域變數的範例

使用 global 宣告的函式: test_global.m

function

test_global(num)

global

VAR; % 宣告 VAR 為一個全域變數 VAR = VAR * num; % 改變 VAR 的內存數值 fprintf(' 在函式內,VAR = %g

\n', VAR);

>>

global

VAR

>> VAR = 3.14;

>> test_global(-2) 在函式內,VAR = -6.28

>> num

Undefined function or variable 'num'.

>> VAR VAR =

-6.2800

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 40/53

(86)

全域變數的範例

使用 global 宣告的函式: test_global.m

function

test_global(num)

global

VAR; % 宣告 VAR 為一個全域變數 VAR = VAR * num; % 改變 VAR 的內存數值 fprintf(' 在函式內,VAR = %g

\n', VAR);

>>

global

VAR

>> VAR = 3.14;

>> test_global(-2) 在函式內,VAR = -6.28

>> num

Undefined function or variable 'num'.

>> VAR VAR =

-6.2800

(87)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

全域變數的範例

使用 global 宣告的函式: test_global.m

function

test_global(num)

global

VAR; % 宣告 VAR 為一個全域變數 VAR = VAR * num; % 改變 VAR 的內存數值 fprintf(' 在函式內,VAR = %g

\n', VAR);

>>

global

VAR

>> VAR = 3.14;

>> test_global(-2) 在函式內,VAR = -6.28

>> num

Undefined function or variable 'num'.

>> VAR VAR =

-6.2800

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 40/53

(88)

全域變數的範例

使用 global 宣告的函式: test_global.m

function

test_global(num)

global

VAR; % 宣告 VAR 為一個全域變數 VAR = VAR * num; % 改變 VAR 的內存數值 fprintf(' 在函式內,VAR = %g

\n', VAR);

>>

global

VAR

>> VAR = 3.14;

>> test_global(-2) 在函式內,VAR = -6.28

>> num

Undefined function or variable 'num'.

>> VAR VAR =

(89)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

Lecture 7

函式呼叫間的資料保存

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 41/53

(90)

區域變數值的續存

續存記憶體(persistent memory)

一種特別類型的記憶體,只允許在函式內存取。

在函式呼叫之間,其值保持不變。

續存變數宣告式

persistent var1 var2 var3. . .

其中 var1、var2、var3 等,是保存在續存記憶體的變數。

(91)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

區域變數值的續存

續存記憶體(persistent memory)

一種特別類型的記憶體,只允許在函式內存取。

在函式呼叫之間,其值保持不變。

續存變數宣告式

persistent var1 var2 var3. . .

其中 var1、var2、var3 等,是保存在續存記憶體的變數。

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 42/53

(92)

範例: 動態平均值 (1/4)

1. 宣告問題

產生一個函式,當輸入一個新的數值時,即時計算資料的動 態平均及標準差。這個函式也需要應使用者的需要,重置動 態總和統計值。

2. 定義輸入和輸出 兩種類型的輸入值:

1 使用字元字串「reset」重置動態總和統計值歸零。

2 輸入資料集合裡的數值,每呼叫函一次,便顯示一個數值。 輸出值: 提供資料的動態平均值與標準差。

3. 設計演算法

Step 1

檢查合法的引數個數

Step 2

檢查’reset’,並重置顯示總和值

Step 3

增加新的數值到動態總和值

Step 4

如果有足夠多的資料,計算並傳回動態平均值與標準差。

如果資料不夠的話,就傳回零。

(93)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

範例: 動態平均值 (1/4)

1. 宣告問題

產生一個函式,當輸入一個新的數值時,即時計算資料的動 態平均及標準差。這個函式也需要應使用者的需要,重置動 態總和統計值。

2. 定義輸入和輸出 兩種類型的輸入值:

1 使用字元字串「reset」重置動態總和統計值歸零。

2 輸入資料集合裡的數值,每呼叫函一次,便顯示一個數值。

輸出值: 提供資料的動態平均值與標準差。

3. 設計演算法

Step 1

檢查合法的引數個數

Step 2

檢查’reset’,並重置顯示總和值

Step 3

增加新的數值到動態總和值

Step 4

如果有足夠多的資料,計算並傳回動態平均值與標準差。

如果資料不夠的話,就傳回零。

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 43/53

(94)

範例: 動態平均值 (1/4)

1. 宣告問題

產生一個函式,當輸入一個新的數值時,即時計算資料的動 態平均及標準差。這個函式也需要應使用者的需要,重置動 態總和統計值。

2. 定義輸入和輸出 兩種類型的輸入值:

1 使用字元字串「reset」重置動態總和統計值歸零。

2 輸入資料集合裡的數值,每呼叫函一次,便顯示一個數值。

輸出值: 提供資料的動態平均值與標準差。

3. 設計演算法

Step 1

檢查合法的引數個數

Step 2

檢查’reset’,並重置顯示總和值

Step 3

增加新的數值到動態總和值

Step 4

如果有足夠多的資料,計算並傳回動態平均值與標準差。

如果資料不夠的話,就傳回零。

(95)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

範例: 動態平均值 (2/4)

4. MATLAB 程式碼 (函式檔名: runstats.m)

function

[ave, std] = runstats(x)

persistent

n sum_x sum_x2

msg = nargchk(1,1,nargin); error(msg);

if

x == 'reset'

n = 0; sum_x = 0; sum_x2 = 0;

else

n = n + 1; sum_x = sum_x + x; sum_x2 = sum_x2 + x^2;

end

if

n == 0

ave = 0; std = 0;

elseif

n == 1

ave = sum_x; std = 0;

else

ave = sum_x / n;

std = sqrt((n*sum_x2 - sum_x^2) / (n*(n-1)));

end

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 44/53

(96)

範例: 動態平均值 (2/4)

4. MATLAB 程式碼 (函式檔名: runstats.m)

function

[ave, std] = runstats(x)

persistent

n sum_x sum_x2

msg = nargchk(1,1,nargin); error(msg);

if

x == 'reset'

n = 0; sum_x = 0; sum_x2 = 0;

else

n = n + 1; sum_x = sum_x + x; sum_x2 = sum_x2 + x^2;

end

if

n == 0

ave = 0; std = 0;

elseif

n == 1

ave = sum_x; std = 0;

else

ave = sum_x / n;

std = sqrt((n*sum_x2 - sum_x^2) / (n*(n-1)));

end

(97)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

範例: 動態平均值 (2/4)

4. MATLAB 程式碼 (函式檔名: runstats.m)

function

[ave, std] = runstats(x)

persistent

n sum_x sum_x2

msg = nargchk(1,1,nargin); error(msg);

if

x == 'reset'

n = 0; sum_x = 0; sum_x2 = 0;

else

n = n + 1; sum_x = sum_x + x; sum_x2 = sum_x2 + x^2;

end if

n == 0

ave = 0; std = 0;

elseif

n == 1

ave = sum_x; std = 0;

else

ave = sum_x / n;

std = sqrt((n*sum_x2 - sum_x^2) / (n*(n-1)));

end

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 44/53

(98)

範例: 動態平均值 (3/4)

4. MATLAB 程式碼 (主程序檔名: test_runstats.m)

% First reset running sums [ave, std] = runstats('reset');

% Prompt for the number of values in the data set nvals = input('Enter number of data: ');

% Get input values

for

ii = 1:nvals

% Prompt for next value

string = ['Enter value ' int2str(ii) ': ']; x = input(string);

% Get running statistics [ave, std] = runstats(x);

% Display running statistics

fprintf('Ave = %8.4f; Std = %8.4f

\n',ave,std);

end

(99)

. . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . .

. .

. . . . .

範例: 動態平均值 (3/4)

4. MATLAB 程式碼 (主程序檔名: test_runstats.m)

% First reset running sums [ave, std] = runstats('reset');

% Prompt for the number of values in the data set nvals = input('Enter number of data: ');

% Get input values

for

ii = 1:nvals

% Prompt for next value

string = ['Enter value ' int2str(ii) ': ']; x = input(string);

% Get running statistics [ave, std] = runstats(x);

% Display running statistics

fprintf('Ave = %8.4f; Std = %8.4f

\n',ave,std); end

Hung-Yuan Fan (范洪源), Dep. of Math., NTNU, Taiwan Chap. 6, Computer Programming 45/53

參考文獻

相關文件

依個人資料保護法第八條規定,本會將會蒐集個人資料,要求輸

Larsen

(二)報名方式:(免報名費)報名時請檢具下列證件(請以A4格式依序

Chou, King-Leung Wong, and Yung-Hsiang Li,“The complete heat transfer solutions of an insulated regular polyhedron pipe by using a RPSWT model,” Energy Conversion and

如果函數是由基本函數所組成,至少需要注意:分式函 數分母會等於 0

動態時間扭曲:又稱為 DTW(Dynamic Time Wraping, DTW) ,主要是用來比

若我們能知道有 k 個 row 的矩陣一 定能利用 elementary row operations 化為 echelon form 這個事實且利用這個事實證得有 k + 1 個 row 的矩陣一定能利用 elementary row

所以 10 個數字 個數字 個數字 個數字 pattern 就產生 就產生 就產生 就產生 10 列資料 列資料 列資料 列資料 ( 每一橫 每一橫 每一橫