北大心理學(xué)系.Matlab概述和編程基礎(chǔ)_第1頁(yè)
北大心理學(xué)系.Matlab概述和編程基礎(chǔ)_第2頁(yè)
北大心理學(xué)系.Matlab概述和編程基礎(chǔ)_第3頁(yè)
北大心理學(xué)系.Matlab概述和編程基礎(chǔ)_第4頁(yè)
北大心理學(xué)系.Matlab概述和編程基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩73頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、MATLAB 概述和編程基礎(chǔ)預(yù)備知識(shí) 線性代數(shù)基礎(chǔ) 常用編程語(yǔ)言(如 C , C+的編程基礎(chǔ) 心理物理學(xué)實(shí)驗(yàn)中的組間、組內(nèi)設(shè)計(jì)及隨機(jī)化知識(shí)本章要點(diǎn) 了解 MATLAB 及其特性 熟悉 MATLAB 基本操作 通過(guò) MATLAB 進(jìn)行基本的數(shù)值運(yùn)算 掌握心理物理學(xué)實(shí)驗(yàn)設(shè)計(jì)中常用的 MATLAB 函數(shù) 編寫簡(jiǎn)單的 MA TLAB 程序并進(jìn)行調(diào)試導(dǎo)言心理學(xué)作為一門建立在實(shí)驗(yàn)基礎(chǔ)上的科學(xué), 該領(lǐng)域內(nèi)的任何結(jié)論都離不開實(shí)驗(yàn)證據(jù)的支 持。隨著心理學(xué)研究的深入,各種實(shí)驗(yàn)方法層出不窮,對(duì)實(shí)驗(yàn)精度的要求越來(lái)越高,與之相 對(duì)應(yīng)的數(shù)據(jù)處理手段也愈發(fā)豐富。 在這樣的趨勢(shì)下, 單純依賴傳統(tǒng)的編程軟件 (如 C 、 C+

2、 和數(shù)據(jù)處理工具(如 SPSS 、 SAS 已經(jīng)無(wú)法滿足心理學(xué)研究者對(duì)于實(shí)驗(yàn)的需求。為了更好 地開展心理學(xué)實(shí)驗(yàn)研究, 研究者們需要更加全面、 精確、 便利的編程工具, 用于輔助他們展 開實(shí)驗(yàn)研究。在本書中,我們將為大家介紹一門在諸多領(lǐng)域內(nèi)都有著廣泛應(yīng)用的編程軟件 MATLAB ,并著重介紹它在心理學(xué)領(lǐng)域內(nèi)的應(yīng)用。MATLAB 是 MAT rix LAB oratory 的縮寫, 它最初是美國(guó)新墨西哥大學(xué) Cleve Moler教授 編寫的 LINPACK 和 EISPACK 接口程序。隨后 Cleve Moler教授又同工程師 Jack Little一起 重新編寫了 MA TLAB , 并且于

3、 1984年成立了 MathWorks 公司, 將這款編程軟件推向市場(chǎng)。 作為第四代編程語(yǔ)言, MA TLAB 擁有著廣泛的應(yīng)用, 包括數(shù)值計(jì)算、 數(shù)據(jù)挖掘、 數(shù)學(xué)建模、 可視化等等,并且與 C 、 C+、 Java 和 Python 等多種編程語(yǔ)言兼容,目前已經(jīng)成為數(shù)值計(jì) 算軟件的佼佼者,并被廣泛應(yīng)用于科學(xué)研究。 圖 1:MA TLAB 創(chuàng)始人 Jack Little(左圖和 Cleve Moler(右圖 ,圖片來(lái)自在本章節(jié)中, 我們將帶領(lǐng)大家初步認(rèn)識(shí)并了解 MATLAB 。 作為一門編程語(yǔ)言, MATLAB有區(qū)別于其他編程語(yǔ)言的特點(diǎn), 這些特點(diǎn)能夠幫助我們通過(guò) MATLAB 進(jìn)行高效的數(shù)據(jù)

4、處理。 通過(guò)學(xué)習(xí)本章節(jié),我們將了解 MATLAB 的特性和編程規(guī)則,學(xué)習(xí)如何通過(guò) MATLAB 進(jìn)行 簡(jiǎn)單的數(shù)據(jù)處理。進(jìn)一步,我們還將學(xué)習(xí)如何通過(guò) MATLAB 編寫、調(diào)試簡(jiǎn)單的程序,并初 步了解一些在心理物理學(xué)實(shí)驗(yàn)中常用的 MATLAB 函數(shù)。2.1 MATLAB 的編程環(huán)境同其他的編程工具一樣, MATLAB 也有著自己獨(dú)特的 編程環(huán)境 和 編程語(yǔ)言 。 MATLAB 的編程環(huán)境是指 MA TLAB 軟件可提供的所有輔助程序設(shè)計(jì)的工具和應(yīng)用的總稱。它包括編 輯器 (Editor 、 命令窗口 (Command Window 、 工作空間 (Workspace 等。 與之相對(duì)應(yīng)的, MATL

5、AB 的編程語(yǔ)言是指可以在 MA TLAB 環(huán)境中執(zhí)行,符合 MATLAB 環(huán)境語(yǔ)法要求的計(jì) 算機(jī)語(yǔ)言。 它不僅包括 MA TLAB 特有的 M 文件 (包括 MA TLAB 特有的數(shù)據(jù)類型、 運(yùn)算符、 程序結(jié)構(gòu)等等 ,也包括了在混合編程時(shí)可以兼容的其他編程語(yǔ)言(如 C 語(yǔ)言,不做詳細(xì)介 紹 。 為了了解 MA TLAB 是如何工作的, 我們將從這兩個(gè)角度分別介紹 MATLAB 的特性 (如 圖 2 ,從而幫助大家對(duì) MATLAB 形成初步的印象。 圖 2:MA TLAB 特性簡(jiǎn)介正如我們之前所描述的, MATLAB 的編程環(huán)境包含一系列可以輔助我們?cè)O(shè)計(jì)程序的工 具和應(yīng)用。為了形象化地了解這些

6、工具和應(yīng)用,我們可以通過(guò)打開 MA TLAB 的主窗口來(lái)形 成對(duì) MATLAB 的編程環(huán)境的初步印象。點(diǎn)擊 MATLAB 圖標(biāo),打開 MA TLAB 主窗口。 圖 3:MA TLAB 主窗口從圖 3的 MA TLAB 主窗口中我們可以清楚地看到 MATLAB 的編程環(huán)境,包括最左側(cè) 的當(dāng)前路徑(Current Directory ,中間的命令窗口(Command Window和最右側(cè)的工作空 間(Workspace 以及命令行歷史(Command History 。我們可以通過(guò)直接拖拽這些窗口的 上邊緣來(lái)重新布局窗口。 同時(shí), 當(dāng)我們點(diǎn)擊圖 3左上方紅色窗口內(nèi)的圖表時(shí), 就可以打開編 輯器(E

7、ditor ,在這里即可編寫 MATLAB 的代碼,并生成 MATLAB 可運(yùn)行的 m 文件,如 圖 4所示。 圖 4:MA TLAB 編輯器在直觀地了解了 MA TLAB 的編程環(huán)境之后,我們將重點(diǎn)介紹三個(gè)需要經(jīng)常使用的編程 環(huán)境, 即命令窗口、 工作空間和代碼編輯器。 為了更加準(zhǔn)確地了解這些編程環(huán)境, 我們首先 給出一段示例代碼: 這段示例代碼的目的在于(1產(chǎn)生三個(gè)取值分別為 1、 2、 3的變量 a 、 b 、 c ,將變量 a 和 b 保存到一個(gè)文件名為 ws.mat 的文件中; (2 清除所有的變量, 并讀入 ws.mat 這個(gè)文件; (3最終將所有這些代碼保存到一個(gè)文件名為 my_

8、diary.txt的文件中。我們將以這段代碼 為示例,分別描述命令窗口、工作空間和代碼編輯器著三個(gè)編程環(huán)境的功能。命令窗口 :在命令窗口中我們可以直接輸入 MATLAB 的代碼并執(zhí)行。將上述代碼逐行 輸入到命令窗口中,按 回車鍵 (Enter 即可執(zhí)行代碼功能。命令窗口也允許用戶同時(shí)執(zhí)行 多行代碼 (例如將上述代碼完整拷貝到命令窗口并按回車鍵, 則可一次性執(zhí)行該代碼的全部 功能 。命令窗口常用來(lái)測(cè)試簡(jiǎn)單的代碼,查詢 MA TLAB 自帶的函數(shù),或者對(duì)正在運(yùn)行的代碼 進(jìn)行中斷操作。 同時(shí), 在運(yùn)行某些需要輸入?yún)?shù)的代碼時(shí), 通常也需要在命令窗口內(nèi)進(jìn)行輸 入。關(guān)于命令窗口有一些常用的快捷鍵,如表

9、1所示。 工作空間 :工作空間用于保存代碼執(zhí)行時(shí)候的所有變量。 直到該變量被清除之前, 它都 一直保存在工作空間中。 這里我們需要了解四個(gè)問(wèn)題:(1 如何查看工作空間中的內(nèi)容? (2 如何保存工作空間中的變量?(3如何清除工作空間中的變量?(4如何將保存的變量再 次讀取到工作空間中?(1如何查看工作空間的中的內(nèi)容?我們可以通過(guò)界面操作直接點(diǎn)擊工作空間中的變量進(jìn)行查看。 當(dāng)我們將上述代碼的前四 行(即截止到“ c = 3;” 輸入到命令窗口后,會(huì)發(fā)現(xiàn)如圖 5所示。圖 5:MA TLAB 工作空間此時(shí)左上方的工作空間窗口中出現(xiàn)了 a 、 b 、 c 三個(gè)變量, 并且在后面直接顯示了這些變 量的賦值

10、。 雙擊任意變量 (如 a , 可以發(fā)現(xiàn)會(huì)出現(xiàn)一個(gè)新的窗口:變量編輯器 (Variable Editor ,在這個(gè)窗口內(nèi),我們可以更加詳細(xì)地觀察工作空間內(nèi)的各個(gè)變量。同時(shí),我們也可以通過(guò) whos 函數(shù)進(jìn)行查詢。在命令窗口內(nèi)輸入如下代碼:>> whos a命令窗口中隨即出現(xiàn)關(guān)于變量 a 的信息, 包括名稱 (Name , 大小 (Size , 字節(jié)數(shù) (Bytes 和數(shù)據(jù)類型(Class ,如圖 5所示。(2如何保存工作空間中的變量?保存工作空間中的變量通常使用 save 函數(shù)。在前面的代碼里,可以注意到第五行的代 碼為:>> save ws a b;輸入此行代碼并執(zhí)行

11、,則會(huì)將工作空間中相應(yīng)的變量 a 、 b 保存到一個(gè)文件名為 ws.mat 的文件中。該文件存放的位置即 MA TLAB 的當(dāng)前路徑(參考圖 3 。如果想一次性保存工作 空間中所有的變量,則可以輸入如下代碼:>> save ws;(3如何清除工作空間中的變量?清除工作空間中的變量通常使用 clear 函數(shù)。在前面的代碼里,可以注意到第六行的代 碼為:>> clear all;輸入此行代碼并執(zhí)行, 則會(huì)清除工作空間中的所有變量。 如果想要清除工作空間中特定 的變量,則直接使用“ clear + 變量名”的形式(一次性清除多個(gè)變量,用空格隔開 。如清 除工作空間中的變量 a

12、 和 b ,則可以輸入如下代碼:>> clear a b;(4如何將保存的變量再次讀取到工作空間中?將保存的變量再次讀取到工作空間中通常使用 load 函數(shù)。在前面的代碼里,可以注意 到第七行的代碼為:>> load ws;輸入此行代碼并執(zhí)行,則會(huì)讀取之前保存了變量 a 、 b 的文件 ws.mat 。此時(shí)觀察工作空 間,則會(huì)發(fā)現(xiàn)重新出現(xiàn)變量 a 、 b 。工作空間中相應(yīng)的變量 a 、 b 保存到一個(gè)文件名為 ws.mat 的文件中。 該文件存放的位置 即 MA TLAB 的當(dāng)前路徑(參考圖 3 。如果想一次性保存工作空間中所有的變量,則可以輸 入如下代碼:>&g

13、t; save ws;在實(shí)際工作中, 有時(shí)候我們需要保存已經(jīng)編寫的代碼, 方便以后查閱和修改。 此時(shí)我們 需要將已經(jīng)編寫完的代碼保存到日志文件中。這可以通過(guò) diary 函數(shù)實(shí)現(xiàn)。在前面的代碼的 第一行和最后一行, 我們定義了需要保存的代碼的起始點(diǎn)和終止點(diǎn), 并通過(guò)第一行定義了所 要保存的文件名和文件格式(即“ diary + 文件名”的形式 。創(chuàng)建的日志文件被保存在當(dāng)前 路徑中。以上我們通過(guò) whos 、 save 、 clear 、 load 和 diary 這五個(gè)函數(shù)了解了如何對(duì)工作空間中的 變量進(jìn)行常見(jiàn)的操作, 并初步認(rèn)識(shí)了工作空間。 工作空間可以幫助我們?cè)诰帉懘a的時(shí)候時(shí) 刻掌握著代

14、碼的運(yùn)行情況,是 MATLAB 非常重要的編程環(huán)境之一。編輯器 :編輯器是 MATLAB 最重要的編程環(huán)境之一。通過(guò)編輯器,我們可以編寫和調(diào) 試 MATLAB 代碼,并將它保存成擴(kuò)展名為“ .m ”的文件,稱之為 M 文件。 M 文件通常在 編輯器中編寫,也可在記事本、寫字板等文本編輯工具中編寫,只需保存成 M 文件即可。例如我們可以將這一節(jié)開頭給出的代碼拷貝到編輯器里, 并且保存到文件名為 “ TestEditor.m ” 的 M 文件里,如圖 6所示。圖 6:通過(guò) MA TLAB 編輯器編寫程序通過(guò)點(diǎn)擊圖 6紅色方框中的運(yùn)行鍵,或者直接鍵入 F5,則可以運(yùn)行該 M 文件中的 全部代碼。 如

15、果想運(yùn)行部分代碼, 則首先選中需要運(yùn)行的代碼片段, 再?gòu)挠益I彈出的快捷菜 單中點(diǎn)擊 Evaluate Selection選擇、或者直接鍵入 F9執(zhí)行(如圖 6所示 。編輯器除了能夠編寫, 運(yùn)行代碼以外, 還能夠方便地對(duì)代碼進(jìn)行逐行調(diào)試, 我們將在后 續(xù)章節(jié)中對(duì)這一功能進(jìn)行詳細(xì)地介紹。 這里我們先簡(jiǎn)單介紹一些編輯器中常見(jiàn)的快捷鍵, 如 表 2所示。表 2 MATLAB編輯器窗口常用快捷鍵 以上,我們分別從命令窗口,工作空間和編輯器這三方面介紹了 MATLAB 獨(dú)特的編程 環(huán)境,并且初步了解了如何使用 MATLAB 。下面,我們將從編程語(yǔ)言的角度,進(jìn)一步為大 家介紹 MA TLAB 的特性。相對(duì)于

16、 MA TLAB 豐富多樣的編程環(huán)境, MATLAB 同樣具有自己獨(dú)特的編程語(yǔ)言, 包括 它所支持的數(shù)據(jù)類型,能夠執(zhí)行的運(yùn)算,以及在編寫 MA TLAB 代碼的時(shí)候所能夠運(yùn)用的各 種程序結(jié)構(gòu)。在本章和第三章中,我們將逐步從這些方面展開,帶領(lǐng)大家了解 MA TLAB 的 編程語(yǔ)言, 并且逐步上手 MATLAB 的編程操作。 在本節(jié)中, 我們首先帶大家了解 MATLAB 編程語(yǔ)言的基礎(chǔ)數(shù)據(jù)類型。任何一門編程語(yǔ)言都是建立在數(shù)據(jù)處理的基礎(chǔ)上。 MATLAB 所支持的豐富的數(shù)據(jù)類型 能夠幫助我們更方便地處理數(shù)據(jù)。 合理地定義并且使用不同的數(shù)據(jù)類型, 能夠幫助我們更加 有效地編寫實(shí)驗(yàn)程序和處理實(shí)驗(yàn)數(shù)據(jù)。變

17、量的定義在介紹 MA TLAB 的數(shù)據(jù)類型之前,我們首先介紹如何通過(guò) MATLAB 定義變量。與 C 語(yǔ)言不同的是,在 MA TLAB 程序里定義變量無(wú)需事先申明,用戶可以在任何需要變量的時(shí) 刻定義變量。例如 C 語(yǔ)言中定義一個(gè)整型變量 X 并賦值為 3,其語(yǔ)句為>> int X;>> X=3;但在 MATLAB 中,就只需要以下一條語(yǔ)句>> X=3;相比于 C 語(yǔ)言,這里的定義方法更加簡(jiǎn)單。但需要注意的是,在 MATLAB 中定義變量 仍然需要依據(jù)一定的規(guī)則: 變量名必須以字母開頭,且變量名中不允許存在空格; 變量名對(duì)大小寫敏感,換句話說(shuō),大寫和小寫的同名

18、字符算作兩個(gè)不同的變量; 不能使用 MATLAB 中預(yù)先定義的變量名、函數(shù)名、關(guān)鍵字,如 pi (圓周率 、 NaN (空值 、 save (保存變量的函數(shù) 、 else (選擇語(yǔ)句中的關(guān)鍵字等等。為了盡可能地使得自己的程序可讀, 我們建議在編程的時(shí)候, 給你所需要定義的變量取 個(gè)有意義的名字, 如定義姓名變量可用 name , 定義性別變量可用 gender 等等。 MA TLAB 的 變量能夠支持多種數(shù)據(jù)類型,下面我們就針對(duì) MA TLAB 的數(shù)據(jù)類型進(jìn)行介紹。MATLAB 的數(shù)據(jù)類型MATLAB 能夠支持 15種基本的數(shù)據(jù)類型,從類型上包括整型(int/uint 、浮點(diǎn)型 (single

19、/double 、字符型(char 、邏輯型(logical 、結(jié)構(gòu)數(shù)組(struct 、元胞數(shù)組(cell 以及函數(shù)句柄(function_handle等。下面我們對(duì)這幾種數(shù)據(jù)類型做簡(jiǎn)單的介紹。整型 :整型分為有符號(hào)整型(int 和無(wú)符號(hào)整型(uint ,根據(jù)存儲(chǔ)時(shí)占用字節(jié)的數(shù)目 又分別分為 8位整型、 16位整型、 32位整型和 64位整型。通常當(dāng)我們采用 MATLAB 讀取 圖片時(shí),系統(tǒng)默認(rèn)的數(shù)據(jù)存儲(chǔ)格式即為 int8型。浮點(diǎn)型 :浮點(diǎn)型又分為單精度浮點(diǎn)型(single 和雙精度浮點(diǎn)型(double 。單精度的存 儲(chǔ)需要 32位, 而雙精度的存儲(chǔ)需要 64位。 因而雙精度浮點(diǎn)型數(shù)據(jù)可以表

20、示的數(shù)值范圍要遠(yuǎn) 高于單精度浮點(diǎn)型數(shù)據(jù),其占用的內(nèi)存空間也要高于整型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)。默認(rèn)情況下, MATLAB 將所有的數(shù)值存儲(chǔ)為雙精度浮點(diǎn)型。字符型 :通常用于表示代碼中所需要讀寫的字符或字符串, 用字符數(shù)組的形式進(jìn)行存儲(chǔ)。 通過(guò)將字符內(nèi)容放置于單引號(hào)進(jìn)行定義。 例如我們可以分別定義兩個(gè)變量 s1、 s2, 一個(gè)表示 字符“ M ” ,另一個(gè)表示字符串“ MA TLAB ” ,可以進(jìn)行如下操作:>> s1 = M;>> s2 = MA TLAB ;邏輯型 :通常用于判斷一段語(yǔ)句是否正確。例如我們可以定義一個(gè)賦值為 0的變量 a , 并通過(guò)變量 b 判斷 a 是否大于

21、 1。可以進(jìn)行如下操作:>> a = 0;>> b = (a > 1b =>> whos bName Size Bytes Class Attributesb 1×1 1 logical從以上我們可以看出, 用于判斷 a 是否大于 1的變量 b 就是一個(gè)邏輯型變量。 當(dāng)判斷的 語(yǔ)句為假(false 的時(shí)候, b 的取值為 0;而當(dāng)判斷的語(yǔ)句為真(true 的時(shí)候, b 的取值為 1。大家可以自己嘗試如下語(yǔ)句:>> b = (a > -1結(jié)構(gòu)數(shù)組 :結(jié)構(gòu)數(shù)組可以包含多種不同的數(shù)據(jù)類型, 從而可以方便我們根據(jù)自己的需要 對(duì)該數(shù)組

22、的不同字段分別進(jìn)行定義。在心理學(xué)物理學(xué)實(shí)驗(yàn)中我們經(jīng)常需要記錄被試的姓名 (Name ,反應(yīng)時(shí)(Time 、準(zhǔn)確率(Accuracy 。通常情況下姓名為字符型數(shù)據(jù),而反應(yīng)時(shí) 和準(zhǔn)確率為浮點(diǎn)型數(shù)據(jù),此時(shí)我們可以通過(guò)定義統(tǒng)一的結(jié)構(gòu)數(shù)組 Response 來(lái)記錄被試的反 應(yīng),具體操作如下:>> Response.Name = Legolas;>> Response.Time = 240.5;>> Response.Accuray = 0.98;>> whos ResponseName Size Bytes Class AttributesResponse

23、 1×1 400 struct此時(shí)我們所定義的 Response 即為一個(gè)結(jié)構(gòu)數(shù)組,通過(guò)調(diào)用結(jié)構(gòu)數(shù)組的不同字段,我們 可以獨(dú)立地對(duì)不同的數(shù)據(jù)類型進(jìn)行處理。元胞數(shù)組 :元胞數(shù)組同樣可以存儲(chǔ)不同類型的數(shù)據(jù), 并且它可以通過(guò)數(shù)字索引 (后面會(huì) 對(duì)索引進(jìn)行詳述 的形式對(duì)所存儲(chǔ)的內(nèi)容進(jìn)行訪問(wèn)。 定義元胞數(shù)組采用大括號(hào) “ ” 的形式, 例如我們類似于結(jié)構(gòu)數(shù)組的方式定義一個(gè)元胞數(shù)組 Response :>> Response = Legolas,240.5,0.98 ;>> whos ResponseName Size Bytes Class AttributesResp

24、onse 1×3 212 cell此時(shí)我們所定義的 Response 即為一個(gè)元胞數(shù)組。函數(shù)句柄 :函數(shù)句柄通常用于間接調(diào)用一個(gè)函數(shù)的取值或數(shù)據(jù)類型。 通常會(huì)用于作圖過(guò) 程中對(duì)圖片的不同屬性進(jìn)行操作。我們將在后續(xù)章節(jié)中詳細(xì)描述這一數(shù)據(jù)類型。以上我們對(duì) MA TLAB 所支持的所有的數(shù)據(jù)類型進(jìn)行了簡(jiǎn)單的介紹,這些數(shù)據(jù)類型的具 體分類如圖 7所示。圖 7:MA TLAB 數(shù)據(jù)類型想要了解特定變量的數(shù)據(jù)類型, 除了可以利用我們之前描述和演示過(guò)的 whos 函數(shù)以外, 我們還可以通過(guò) MA TLAB 中自帶的 class 函數(shù)或 isa 函數(shù)查看。 例如我們想查看通過(guò)語(yǔ)句 “ a = 1”定

25、義的變量 a 究竟是 double 型數(shù)據(jù)還是 int8型數(shù)據(jù),我們可以在命令窗口輸入以下代 碼:>> a = 1;>> isa(a,doubleans =1>> isa(a,int8ans =>> class(aans =double注意到當(dāng)使用 isa 函數(shù)時(shí), MA TLAB 返回了兩個(gè)值 1和 0,這分別告訴我們變量 a 是 double 型數(shù)據(jù), 而非 int8型數(shù)據(jù)。 當(dāng)我們想判定某變量是否為特定數(shù)據(jù)類型時(shí), 我們可以依 據(jù)“ isa (變量名 , 數(shù)據(jù)類型 ”的方法進(jìn)行輸入, MA TLAB 會(huì)返回 1(是或 0(否來(lái)告訴 我們?cè)撟?/p>

26、量是否屬于后面的數(shù)據(jù)類型。 當(dāng)使用 class 函數(shù)時(shí), MATLAB 會(huì)直接返回該變量的 數(shù)據(jù)類型,因此可通過(guò)“ class (變量名 ”查詢特定變量的數(shù)據(jù)類型。在本節(jié)中,我們分別從 MATLAB 的編程環(huán)境和編程語(yǔ)言(具體表現(xiàn)為 MA TLAB 所支 持的數(shù)據(jù)類型這兩個(gè)角度為大家簡(jiǎn)單介紹了 MATLAB 的特性,并初步了解如何使用 MATLAB 。在本章的后續(xù)章節(jié)里,我們將重點(diǎn)為大家講述如何通過(guò) MA TLAB 進(jìn)行簡(jiǎn)單的數(shù) 值運(yùn)算,并通過(guò) MA TLAB 編寫簡(jiǎn)單的程序。2.2 矩陣基礎(chǔ)和運(yùn)算 本節(jié)中, 我們將帶領(lǐng)大家學(xué)習(xí)如何通過(guò) MATLAB 進(jìn)行簡(jiǎn)單的數(shù)值運(yùn)算。 正如 MATLAB

27、的全稱 mat rix lab oratory 一樣, MA TLAB 是一門以矩陣為基礎(chǔ)的編程語(yǔ)言,它所支持的絕 大部分運(yùn)算都是建立在對(duì)矩陣進(jìn)行操作的基礎(chǔ)上的。為了幫助大家更好地領(lǐng)會(huì) MA TLAB 的 編程思想,本節(jié)中我們將首先為大家介紹 MA TLAB 的矩陣基礎(chǔ),再為大家介紹如何使用 MATLAB 進(jìn)行簡(jiǎn)單的運(yùn)算。MATLAB 矩陣基礎(chǔ)矩陣(matrix 是 MA TLAB 進(jìn)行數(shù)據(jù)存儲(chǔ)和運(yùn)算的核心:在 MA TLAB 中,所有的變量 都是以矩陣的形式進(jìn)行存儲(chǔ)并加以運(yùn)算的。要想了解如何利用 MA TLAB 進(jìn)行數(shù)值運(yùn)算,兩 個(gè)關(guān)鍵性的問(wèn)題是(1如何定義矩陣?(2如何提取矩陣中的元素?下

28、面我們將帶領(lǐng)大家 分別解決這兩個(gè)問(wèn)題。MATLAB ,矩陣的構(gòu)造是通過(guò)產(chǎn)生一個(gè)數(shù)組完成的。例如,我們想要定義一個(gè)變量 a , 它是一個(gè) 2×3的矩陣,矩陣內(nèi)元素的取值為 1到 6,我們可以在命令窗口鍵入如下代碼: >> a = 1 2 3; 4 5 6a =1 2 34 5 6從上述代碼我們可以注意到在 MATLAB 中構(gòu)造矩陣的兩個(gè)關(guān)鍵問(wèn)題:(1矩陣是通過(guò)中括號(hào)進(jìn)行定義的,一個(gè)中括號(hào)可以定義一個(gè)矩陣;(2矩陣中同一行內(nèi)的不同列通過(guò)空格或逗號(hào)進(jìn)行分隔,不同行之間則通過(guò)分號(hào)進(jìn)行 分隔(需要注意,所有的符號(hào)都為英文半角符號(hào) 。此時(shí)我們就成功定義了一個(gè)矩陣,并且可以隨時(shí)在 MA

29、TLAB 中通過(guò)提取矩陣中的元素 進(jìn)行操作。提取矩陣中的元素可以采用 標(biāo)量 或 矩陣索引 (scalar 的方法進(jìn)行。標(biāo)量即指直 接標(biāo)示矩陣中所要提取的元素的行和列, 例如我們想要提取上述定義的 a 矩陣中的第一行第 二列的元素,則可以輸入如下代碼:>> a(1,2ans =2此時(shí),我們就成功提取出所需要的元素。標(biāo)量一般在提取矩陣中單一元素的時(shí)候采用, 如果需要一次性提取矩陣若干元素, 我們則需要采用矩陣索引的方法。 顧名思義, 矩陣索引 用于標(biāo)示一系列所要提取的元素的位置。 同標(biāo)量類似, 我們只需要將需要提取的元素所在的 行和列分別用一個(gè)索引的矩陣標(biāo)示即可。 例如我們想要提取上述

30、定義的 a 矩陣中的第二行第 一列和第三列的元素,則可以輸入如下代碼:>> a(2,1 3ans =4 6我們可以注意到, 通過(guò)矩陣索引提取元素的方法與通過(guò)標(biāo)量提取矩陣元素的方法非常類 似。通過(guò)矩陣索引,我們可以同時(shí)提取矩陣中多行多列的不同元素,如:>> a(1 2, 2 3ans =2 35 6除了通過(guò)標(biāo)量和矩陣索引提取矩陣元素外, 常用的用于提取矩陣元素的方法還包括使用 冒號(hào)(“ :” 和 end 的方法。其中冒號(hào)表示該維度上的所有元素。例如我們想要提取上述定 義的 a 矩陣中的第二行的所有元素,則可以輸入如下代碼:ans =4 5 6我們可以注意到, 此時(shí)冒號(hào)的作

31、用相當(dāng)于之前標(biāo)量或者矩陣索引的作用, 用于標(biāo)示提取 該列的所有元素。類似的,我們還可以通過(guò)冒號(hào)提取矩陣中第三列的所有元素,如:>> a(:,3ans =36除此之外, 如果某些時(shí)候我們并不想提取某一維度上的所有元素, 而只是想提取幾個(gè)連 續(xù)的元素, 我們還可以為冒號(hào)的前后分別設(shè)置起始點(diǎn)和終止點(diǎn), 用于標(biāo)示所要提取元素的起 始位置和終止位置。 例如我們想要分別提取上述定義的 a 矩陣中的第二行的前兩個(gè)元素和后 兩個(gè)元素,則可以輸入如下代碼:>> a(2, 1:2ans =4 5>> a(2,2:3ans =5 6與之類似, end 則表示該行或該列的最后一個(gè)元

32、素所在的位置, 通常結(jié)合冒號(hào)一起使用, 用于標(biāo)示起始位置或終止位置(其作用和矩陣索引類似 。例如我們想要分別提取上述定義 的 a 矩陣中的第二行的所有元素,前兩個(gè)元素和后兩個(gè)元素,則可以輸入如下代碼:>> a(2, 1:endans =4 5 6>> a(2,1:end-1ans =4 5>> a(2,2:endans =5 6MATLAB 不僅能夠處理常見(jiàn)的二維矩陣,同時(shí)也能夠?qū)Χ嗑S矩陣進(jìn)行處理。定義多維 矩陣的方法與二維矩陣的方法類似, 即在定義矩陣的時(shí)候多添加一個(gè)維度。 例如, 我們想要 定義一個(gè) 2行、 2列、 3頁(yè)的矩陣 A (即矩陣的大小為 2&

33、#215;2×3 ,可以通過(guò)結(jié)合先前介紹的 索引方法,逐頁(yè)對(duì)矩陣進(jìn)行定義。具體方法如下:>> A(:, :, 1 = 1 2; 3 4A(:, :, 1 =1 23 4>> A(:, :, 2 = 5 6; 7 8A(:, :, 2 =5 6>> A(:, :, 3 = 9 10; 11 12A(:, :, 3 =9 1011 12從上面的定義方法我們可以發(fā)現(xiàn), 定義多維矩陣的方法與定義二維矩陣的方法非常類似:即在矩陣的第三個(gè)維度上的每一頁(yè)上分別定義一個(gè)二維矩陣。 多維矩陣在心理學(xué)實(shí)驗(yàn)的設(shè)計(jì) 和數(shù)據(jù)處理中應(yīng)用非常廣泛,我們將在后續(xù)的章節(jié)具體介紹多維

34、矩陣的應(yīng)用實(shí)例。以上篇幅中, 我們分別從如何定義矩陣, 以及如何提取矩陣中的元素這兩個(gè)角度, 初步 了解了 MA TLAB 運(yùn)算的核心:矩陣。下面我們將帶大家重點(diǎn)學(xué)習(xí),如何對(duì)矩陣進(jìn)行一系列 運(yùn)算操作。MATLAB 矩陣運(yùn)算MATLAB 可以方便地完成我們?cè)谄綍r(shí)需要對(duì)矩陣進(jìn)行的各種簡(jiǎn)單操作,如加減乘除、 乘方、 轉(zhuǎn)置等等, 下面我們對(duì)如何進(jìn)行這些操作分別進(jìn)行簡(jiǎn)單的介紹。 例如現(xiàn)在我們分別在 MATLAB 中定義兩個(gè)已知的矩陣 A 和 B :>> A = 1 2; 3 4A =1 23 4>> B = 5 6; 7 8B =5 67 8那么我們可以分別對(duì)他們進(jìn)行如下操作:加

35、法(+ :通過(guò)運(yùn)算符“ +”可以將兩個(gè)矩陣進(jìn)行相加,相加后的矩陣大小與進(jìn)行加法 運(yùn)算的矩陣大小相同, 矩陣內(nèi)元素的取值為進(jìn)行加法運(yùn)算的兩個(gè)矩陣內(nèi)對(duì)應(yīng)位置的元素值之 和。例如將矩陣 A 和 B 相加如下:>> A + Bans =6 810 12減法(- :通過(guò)運(yùn)算符“ -”可以將兩個(gè)矩陣進(jìn)行相減,相減后的矩陣大小與進(jìn)行減法 運(yùn)算的矩陣大小相同, 矩陣內(nèi)元素的取值為進(jìn)行減法運(yùn)算的兩個(gè)矩陣內(nèi)對(duì)應(yīng)位置的元素值之 差。例如將矩陣 A 和 B 相減如下:>> A - Bans =-4 -4-4 -4乘法(* :通過(guò)運(yùn)算符“ *”可以將兩個(gè)矩陣進(jìn)行相乘,相乘的運(yùn)算法則同矩陣乘法的

36、運(yùn)算法則一致。例如將矩陣 A 和 B 相乘如下:>> A * Bans =19 2243 50除法(包括左除“ /”和右除“ ” :矩陣的除法包括左除和右除,我們可以通過(guò)這兩種 運(yùn)算來(lái)解矩陣方程。 左除 :已知矩陣方程 xA = B中的矩陣 A 和 B ,想要求解矩陣 x 。我們 可以通過(guò)矩陣左除的方法計(jì)算出 x = B / A。類似的,我們也可以在 MA TLAB 中運(yùn)用這樣的 方法進(jìn)行計(jì)算,例如:>> x = B / Ax =-1 2-2 3我們可以將上述求解的 x 通過(guò) MATLAB 進(jìn)行驗(yàn)證。 將求解得到的 x 與矩陣 A 相乘, 可 以發(fā)現(xiàn)計(jì)算結(jié)果等于矩陣 B

37、 ,具體運(yùn)算如下:>> x * Aans =5 67 8右除 :已知矩陣方程 Ax = B中的矩陣 A 和 B ,想要求解矩陣 x 。我們可以通過(guò)矩陣右 除的方法計(jì)算出 x = A B。類似的,我們也可以在 MATLAB 中運(yùn)用這樣的方法進(jìn)行計(jì)算, 例如:>> x = A Bx =-3 -44 5我們可以將上述求解的 x 通過(guò) MATLAB 進(jìn)行驗(yàn)證。 將矩陣 A 與求解得到的 x 相乘, 可 以發(fā)現(xiàn)計(jì)算結(jié)果等于矩陣 B ,具體運(yùn)算如下:>> A * xans =5 67 8乘方( :通過(guò)運(yùn)算符“ ”可以將某個(gè)矩陣進(jìn)行乘方運(yùn)算。在運(yùn)算符“ ”后輸入乘 方的冪

38、次即可。例如將矩陣 A 做三次乘方的具體計(jì)算如下:>> A 3ans =37 5481 118轉(zhuǎn)置( :通過(guò)運(yùn)算符“ ”可以將某個(gè)矩陣進(jìn)行轉(zhuǎn)置運(yùn)算,即將矩陣的行和列對(duì)應(yīng)的 元素進(jìn)行互換。例如將矩陣 A 做轉(zhuǎn)置的具體計(jì)算如下:>> A ans =1 32 4除了矩陣運(yùn)算之外, MA TLAB 還可以進(jìn)行常見(jiàn)的數(shù)組運(yùn)算, 即將 MATLAB 程序中所定 義的矩陣視為數(shù)組并進(jìn)行相應(yīng)的運(yùn)算。 這在心理學(xué)實(shí)驗(yàn)的數(shù)據(jù)處理中應(yīng)用也是非常廣泛。 常見(jiàn)的數(shù)組運(yùn)算包括數(shù)組的乘法和除法。數(shù)組乘法(又稱點(diǎn)乘 :通過(guò)運(yùn)算符“ .*”可以將兩個(gè)矩陣中對(duì)應(yīng)位置的元素點(diǎn)點(diǎn)相乘 (即數(shù)組乘法的原理 。例

39、如,我們可以將矩陣 A 和矩陣 B 進(jìn)行點(diǎn)乘運(yùn)算,具體計(jì)算如下: >> A .* Bans =5 1221 32數(shù)組乘法(又稱點(diǎn)除,包括點(diǎn)左除和點(diǎn)右除 :通過(guò)運(yùn)算符“ ./”或“ .”可以將兩個(gè)矩 陣中對(duì)應(yīng)位置的元素進(jìn)行左除或右除運(yùn)算。 點(diǎn)左除 (./ :將運(yùn)算符左側(cè)的矩陣中的元素除以 運(yùn)算符右側(cè)的矩陣中的對(duì)應(yīng)位置的元素。例如,我們可以將矩陣 A 和矩陣 B 進(jìn)行點(diǎn)左除運(yùn) 算,具體計(jì)算如下:>> A ./ Bans =0.2000 0.33330.4286 0.5000點(diǎn)右除(. :將運(yùn)算符右側(cè)的矩陣中的元素除以運(yùn)算符左側(cè)的矩陣中的對(duì)應(yīng)位置的元 素。例如,我們可以將矩陣

40、 A 和矩陣 B 進(jìn)行點(diǎn)右除運(yùn)算,具體計(jì)算如下:>> A . Bans =5.0000 3.00002.3333 2.0000數(shù)組乘方 (又稱點(diǎn)乘方 :通過(guò)運(yùn)算符 “ .” 可以將矩陣中的元素獨(dú)立地進(jìn)行乘方運(yùn)算。 在運(yùn)算符“ .”后輸入乘方的冪次即可。例如將矩陣 A 做三次點(diǎn)乘方的具體計(jì)算如下: >> A . 3ans =1 827 64以上所有的矩陣運(yùn)算, 除了可以通過(guò)運(yùn)算符實(shí)現(xiàn)以外, 均可以通過(guò)相應(yīng)的函數(shù)加以實(shí)現(xiàn)。 例如我們可以通過(guò) plus 函數(shù)完成矩陣 A 和 B 的相加,具體計(jì)算如下:>> plus (A, Bans =6 810 12得到的結(jié)果同

41、直接使用“ +”運(yùn)算符計(jì)算的結(jié)果是一致。下表中我們列出了 MATLAB 同上面介紹的運(yùn)算符起到相同作用的函數(shù),可供大家使用的時(shí)候查詢。表 3 MATLAB常用運(yùn)算函數(shù) 除了常見(jiàn)的矩陣運(yùn)算以外, MATLAB 中對(duì)矩陣的處理還包括矩陣的關(guān)系、 邏輯的運(yùn)算, 這涉及到 MATLAB 中常用的關(guān)系運(yùn)算符和邏輯運(yùn)算符,下面我們?cè)賹?duì)這些運(yùn)算符做簡(jiǎn)單的 介紹關(guān)系運(yùn)算符 :常見(jiàn)的關(guān)系運(yùn)算符包括大于(> 、小于(< 、大于等于(>= 、小于等于 (<= 、等于(=和不等于(= 。通過(guò)將需要比較的矩陣或者元素置于關(guān)系運(yùn)算符的兩 側(cè),我們可以比較兩者的關(guān)系。例如我們定義兩個(gè)矩陣 A 和 B

42、>> A = 1 2; 3 4A =1 23 4>> B = 2 1; 3 3B =2 13 3下面我們分別通過(guò)比較這兩個(gè)矩陣中的元素是否存在大于、 小于等于、 等于和不等于的 關(guān)系,來(lái)演示如何使用關(guān)系運(yùn)算符。具體計(jì)算如下:>> A > Bans =0 10 1>> A <= Bans =1 01 0>> A = Bans =0 01 0>> A = Bans =1 10 1從以上的結(jié)果我們可以發(fā)現(xiàn),關(guān)系運(yùn)算符的結(jié)果是通過(guò) 1(真和 0(假來(lái)呈現(xiàn)的。 當(dāng)通過(guò)關(guān)系運(yùn)算符比較兩個(gè)矩陣的時(shí)候, 實(shí)際上比較的是矩陣中對(duì)

43、應(yīng)位置的元素的關(guān)系。 關(guān) 系運(yùn)算符通常會(huì)被運(yùn)用于程序的流程控制中,我們會(huì)在后續(xù)章節(jié)中詳細(xì)介紹。邏輯運(yùn)算符 :常見(jiàn)的邏輯運(yùn)算符包括與(& 、或(| 、短路邏輯與(&& 、短路邏輯 或(|和非( 。通過(guò)將需要比較的對(duì)象置于邏輯運(yùn)算符的兩側(cè),我們可以構(gòu)造兩個(gè)對(duì)象 直接的邏輯關(guān)系。例如我們首先定義三個(gè)變量“ a=1; b=2; c=0” ,并通過(guò)構(gòu)造這三個(gè)對(duì)象直接的邏輯關(guān)系,對(duì)邏輯運(yùn)算符做簡(jiǎn)單的介紹。與(& :當(dāng)兩個(gè)對(duì)象均為真時(shí),結(jié)果才為真。當(dāng)兩個(gè)對(duì)象中只要有一個(gè)為假時(shí),結(jié)果 即為假。例如我們分別考察變量 a 和 b 以及 a 和 c 之間的邏輯關(guān)系,具體計(jì)算如下:&g

44、t;> a & bans =1>> a & cans =從以上結(jié)果我們可以看出,通過(guò) 1(真和 0(假可以反映邏輯運(yùn)算符前后對(duì)象間的 邏輯關(guān)系。由于 a 和 b 變量均為真,因而這兩個(gè)變量之間與運(yùn)算的結(jié)果為真。反之,由于 c 變量為假,從而變量 a 和 c 之間的與運(yùn)算結(jié)果為假?;?| :當(dāng)兩個(gè)對(duì)象中只要有一個(gè)為真時(shí),結(jié)果即為真。當(dāng)兩個(gè)對(duì)象都為假時(shí),結(jié)果為 假。例如我們分別考察變量 a 和 b 以及 a 和 c 之間的邏輯關(guān)系,具體計(jì)算如下:>> a & bans =1>> a & cans =1從以上結(jié)果我們可以看出,

45、通過(guò) 1(真和 0(假可以反映邏輯運(yùn)算符前后對(duì)象間的 邏輯關(guān)系。由于 a 變量為真,所以 a 和 b 以及 a 和 c 之間或運(yùn)算的結(jié)果均為真。短路邏輯與(&& :和邏輯運(yùn)算符“ &”不同的是,短路邏輯與“ &&”會(huì)逐個(gè)判斷每 個(gè)對(duì)象。一旦遇到某個(gè)對(duì)象為假,則不計(jì)算其他對(duì)象,直接返回假。短路邏輯或 (| :和邏輯運(yùn)算符 “ |” 不同的是, 短路邏輯或 “ |” 會(huì)逐個(gè)判斷每個(gè)對(duì)象。 一旦遇到某個(gè)對(duì)象為真,則不計(jì)算其他對(duì)象,直接返回真。否( :用于改變對(duì)象的真假。如果對(duì)象為真,則變?yōu)榧?否則如果對(duì)象為假,則變 為真。例如我們分別通過(guò)邏輯運(yùn)算符否改變 a

46、和 c 之間的真假,具體計(jì)算如下:>> aans =>> cans =1從以上結(jié)果我們可以看出, a 和 c 本身為真和假,但通過(guò)邏輯運(yùn)算符否,使得他們的真 值分別變成了假和真。以上我們所介紹的矩陣運(yùn)算, 包括邏輯運(yùn)算符和關(guān)系運(yùn)算符, 都可以被用來(lái)進(jìn)行矩陣的 計(jì)算。 不同類型的計(jì)算存在一定的優(yōu)先級(jí)關(guān)系。 下面我們對(duì)所有的運(yùn)算符的優(yōu)先級(jí)進(jìn)行總結(jié), 它們從高到低的優(yōu)先級(jí)為:(1轉(zhuǎn)置、乘方、數(shù)組乘方,(2邏輯非(3矩陣乘除法、數(shù)組乘除法(4矩陣加減法、數(shù)組加減法(5冒號(hào)(6關(guān)系(7邏輯與(8邏輯或(9短路邏輯與(10短路邏輯或在本節(jié)中我們介紹了矩陣的基礎(chǔ), 包括如何定義矩陣,

47、 矩陣的運(yùn)算以及不同類型的運(yùn)算 符。這些構(gòu)成了 MATLAB 編程的基礎(chǔ)。在后續(xù)章節(jié)中,我們將在上述基礎(chǔ)上進(jìn)行展開,逐 步介紹如何通過(guò) MA TLAB 編寫結(jié)構(gòu)化的程序,并且將其應(yīng)用于心理學(xué)實(shí)驗(yàn)當(dāng)中。2.3 MATLAB程序設(shè)計(jì)基礎(chǔ)通過(guò)以上的篇幅,我們對(duì) MATLAB 的編程基礎(chǔ)做了一定的介紹。通過(guò)運(yùn)用這些編程基 礎(chǔ),我們可以自己編寫程序,從而完成相應(yīng)的需求。雖然 MA TLAB 的程序設(shè)計(jì)包含的內(nèi)容 五花八門, 但是簡(jiǎn)而言之, 它是建立在 程序的創(chuàng)建 和 程序的調(diào)試 這兩個(gè)步驟上的。 在本節(jié)中, 我們將分別從這兩個(gè)方面,帶領(lǐng)大家初步了解如何通過(guò) MA TLAB 編寫程序,從而學(xué)習(xí) MATLA

48、B 的程序設(shè)計(jì)基礎(chǔ)。(2依次點(diǎn)擊 MA TLAB 主界面中的菜單 File > New > Blank M-File;(3在命令窗口中輸入指令 edit 。通過(guò)上述方法,我們可以打開 MATLAB 編輯器。在其中輸入 MA TLAB 程序代碼并保 存,即可成功創(chuàng)建一個(gè) MATLAB 程序文件。正如我們先前所述, MA TLAB 的程序文件除了可以在 MA TLAB 自帶的編輯器中編寫, 還可以在諸如記事本等軟件中進(jìn)行編寫。但是由于 MATLAB 編輯器具有一定程度上的識(shí)別 語(yǔ)法錯(cuò)誤的功能,因而我們強(qiáng)烈建議在 MATLAB 編輯器中編寫 MA TLAB 程序。MATLAB 的程序文件

49、通常包括兩種形式,腳本(script 和函數(shù)(function 。其中腳本 文件是通過(guò)將一系列的 MATLAB 語(yǔ)句放在一起并保存成的 M 文件。 它一方面不能夠像函數(shù) 那樣接受參數(shù)的輸入或返回結(jié)果, 另一方面它也具有函數(shù)不具備的優(yōu)勢(shì):能夠?qū)⒊绦蛑兴?義的變量完整地保存在工作空間中, 從而方便用戶查看程序的運(yùn)行結(jié)果。 腳本文件通常被用 來(lái)編寫一次性使用的,目的、結(jié)構(gòu)簡(jiǎn)單的程序,方便用戶立即使用。例如下圖中我們展示了 一個(gè)簡(jiǎn)單的腳本。在該段程序中,我們分別生成了一個(gè)取值呈正弦函數(shù)變化的變量 y ,并在 y 上增加了均勻噪音,生成了一個(gè)新的變量 ynoise ,再通過(guò) MATLAB 將其繪制出來(lái)

50、。通過(guò) 點(diǎn)擊圖 8中紅色方框的快捷鍵,或者直接鍵入快捷鍵 F5,我們可以方便地執(zhí)行這段腳本文 件程序并觀察結(jié)果。 圖 8:腳本文件程序示例而函數(shù)文件則是通過(guò) MA TLAB 函數(shù)所要求的一定格式進(jìn)行編寫并保存的 M 文件。 它能 夠接受用戶指定的參數(shù)輸入并輸出用戶可能需要調(diào)用的結(jié)果。 但是在函數(shù)文件中所定義的變 量, 在函數(shù)運(yùn)行結(jié)束后是不會(huì)保存在工作空間中的。 雖然如此, 但是由于函數(shù)文件能夠允許 用戶指定輸入和輸出, 而且方便用戶進(jìn)行調(diào)用, 因而它相對(duì)于腳本文件具有更好的靈活性和 適用性,通常被用來(lái)編寫需多次使用的程序。在 MATLAB 中,函數(shù)大致分為永久性函數(shù)和 臨時(shí)性函數(shù), 其中臨時(shí)性

51、函數(shù)又包括內(nèi)聯(lián)函數(shù)和匿名函數(shù)。 下面我們分別對(duì)其進(jìn)行簡(jiǎn)單的介 紹。永久性函數(shù) :永久性函數(shù)是 MA TLAB 最常用的函數(shù)形式。它指的是由函數(shù)文件形式所 建立起的自定義函數(shù)。 永久性函數(shù)可以在編輯器中編寫并保存, 并可以在命令窗口和其他 M 文件中進(jìn)行調(diào)用。永久性函數(shù)通過(guò) function 語(yǔ)句指引,它通常的格式為: 在以上函數(shù)形式中,中括號(hào)內(nèi)的 out1, out2等變量為輸出參數(shù)列表(當(dāng)輸出的參數(shù)沒(méi)有 或只有一個(gè)時(shí), 不需要用中括號(hào) , 括號(hào)內(nèi)的 input1, input2等變量為輸入?yún)?shù)列表, FunName 為函數(shù)名。 在函數(shù)中, 用百分號(hào) “ %” 引導(dǎo)出函數(shù)中的注釋部分, 這些部

52、分可以在 MATLAB 的命令窗口中通過(guò) help 指令顯示出來(lái)。在永久性函數(shù)中,函數(shù)的函數(shù)名的命名規(guī)則與變量名相同,且最好和 M 文件的文件名 一致,且必須保存在單一的 M 文件中。函數(shù)輸出參數(shù)列表中提到的變量要在函數(shù)體中予以 賦值。 在編寫自定義的函數(shù)時(shí), 函數(shù)名要避免和系統(tǒng)本身自帶函數(shù)的函數(shù)名重合。 下面我們 來(lái)通過(guò)實(shí)現(xiàn)一個(gè)要求,來(lái)編寫一個(gè)永久性函數(shù)。問(wèn)題:編寫一個(gè)函數(shù),函數(shù)名為 MyFirstFunction ,函數(shù)的輸入為兩個(gè)變量 x 和 y ,輸出 為一個(gè)正整數(shù)變量 m ,要求函數(shù)滿足如下條件:(1 當(dāng)輸入的變量少于兩個(gè)或者多于兩個(gè)時(shí), 分別輸出 “ Not enough inpu

53、t argument!” 或 “ Too many input arguments!” ; 當(dāng) x 或 y 中有空變量的時(shí)候, 退出程序, 并且在命令窗口中輸出 “ The input value is empty!” ;(2 m 為滿足不等式 y< xkmk=1的最小的正整數(shù)。為了編寫這個(gè)函數(shù), 我們需要首先創(chuàng)建函數(shù)的形式, 并且分別實(shí)現(xiàn)函數(shù)的兩個(gè)要求。 具 體的步驟如下:(1創(chuàng)建函數(shù)的形式:我們首先在編輯器中定義函數(shù)的格式,即通過(guò) function 語(yǔ)句引 導(dǎo)出函數(shù)的形式,具體如下: 并且將該文件保存為 MyFirstFunction.m 。(2實(shí)現(xiàn)第一個(gè)要求。我們通過(guò) MA TLA

54、B 所支持的 if elseif 程序結(jié)構(gòu)(詳見(jiàn)第三 章 來(lái)逐步判定輸入變量的數(shù)目和是否為空值。 其中判定輸入變量的數(shù)目可以通過(guò)系統(tǒng)自帶 的 nargin 永久變量實(shí)現(xiàn)(nargin 變量記錄了輸入變量的數(shù)目;類似的, nargout 變量記錄了 輸出變量的數(shù)目 。判定 x 和 y 是否為空值可以用系統(tǒng)自帶的 isempty 函數(shù)實(shí)現(xiàn)(isempty 函 數(shù)可以判斷某個(gè)變量是否為空值 。結(jié)合系統(tǒng)自帶的 disp 函數(shù)(disp 函數(shù)用于在命令窗口中 輸出文本 ,可以實(shí)現(xiàn)函數(shù)的第一個(gè)要求。具體如下: (3實(shí)現(xiàn)第二個(gè)要求。我們可以通過(guò)定義不等式右側(cè)的變量為 sum ,并且通過(guò) while 循環(huán)語(yǔ)句

55、(詳見(jiàn)第三章依次檢查符合要求的 m 值。具體如下: 以上我們通過(guò)三個(gè)步驟實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的函數(shù)文件的編寫, 大家可以自行在命令窗口內(nèi) 調(diào)用該函數(shù),調(diào)用的格式為:>> m = MyFirstFunction (x, y在以后編寫函數(shù)文件的時(shí)候, 大家也可以按照函數(shù)所需要的要求一步一步完成對(duì)函數(shù)的 編寫。 在后續(xù)章節(jié)中, 我們還將繼續(xù)為大家講解如何調(diào)試函數(shù)文件, 以確保函數(shù)能夠正確地 運(yùn)行。臨時(shí)函數(shù) :臨時(shí)函數(shù)包括內(nèi)聯(lián)函數(shù) (inline function 和匿名函數(shù) (anonymous function 。 它們既可以在編輯器中編輯, 也可以在命令窗口中編輯。 臨時(shí)函數(shù)通常用于創(chuàng)建需

56、要臨時(shí)使 用的簡(jiǎn)單的函數(shù)。 在這其中, 匿名函數(shù)的效率優(yōu)于臨時(shí)函數(shù), 因此建議大家在使用的時(shí)候盡 量采用匿名函數(shù)。這兩者的具體格式如下:(1內(nèi)聯(lián)函數(shù):內(nèi)聯(lián)函數(shù)由 inline 函數(shù)建立,其格式為: 其中 FunName 表示函數(shù)的函數(shù)名,可以供調(diào)用。 expression 為函數(shù)的表達(dá)式, arg1和 arg2等為輸入變量。例如,我們?cè)诿畲翱谥芯帉懸粋€(gè)“計(jì)算兩個(gè)輸入變量的立方和” 的內(nèi) 聯(lián)函數(shù),并且計(jì)算它在兩個(gè)輸入變量分別取值為 2和 3時(shí)的結(jié)果,具體可以如下編寫: >> f = inline (x3 + y3, x, y ;>> f (2, 3ans =35(2匿名

57、函數(shù):匿名函數(shù)通過(guò)符號(hào)“ ”表示函數(shù)指針(或稱函數(shù)句柄 ,其格式為: 其中 FunName 表示函數(shù)的函數(shù)名, 可以供調(diào)用。 同內(nèi)聯(lián)函數(shù)一樣, expression 為函數(shù)的 表達(dá)式, arg1和 arg2等為輸入變量。我們來(lái)采用匿名函數(shù)實(shí)現(xiàn)上述內(nèi)聯(lián)函數(shù)相同的功能, 具體可以如下編寫:>> f = (x, y x3 + y3;>> f (2, 3ans =35在了解了基本的函數(shù)創(chuàng)建格式之后, 我們?cè)趯?shí)際編寫函數(shù)程序的時(shí)候經(jīng)常會(huì)碰到這樣一 個(gè)問(wèn)題:在編寫一個(gè)函數(shù)的時(shí)候, 需要調(diào)用另一個(gè)可能會(huì)反復(fù)使用的功能 (例如在編寫實(shí)驗(yàn) 程序的時(shí)候,可能需要在實(shí)驗(yàn)中頻繁生成一組隨機(jī)序列

58、以安排實(shí)驗(yàn)試次的順序 ,那么這個(gè) 時(shí)候最好的做法就是將這項(xiàng)功能編寫成另一個(gè)函數(shù), 并且加以調(diào)用。 為此, 我們將介紹一個(gè) 概念:子函。并且在函數(shù)調(diào)用的基礎(chǔ)上,介紹創(chuàng)建 MATLAB 函數(shù)時(shí)經(jīng)常需要使用的一項(xiàng)功 能:函數(shù)的遞歸。子函數(shù) :顧名思義,子函數(shù)是和主函數(shù)相對(duì)應(yīng)的。 通常而言,一個(gè)函數(shù)文件中只包含一 個(gè)函數(shù)。但是有些情況下,為了編程的方便,一個(gè)函數(shù)文件中可能會(huì)包含多個(gè)函數(shù)。這時(shí), 我們將函數(shù)文件中的第一個(gè)函數(shù)稱為 主函數(shù) ,將其他的函數(shù)稱為 子函數(shù) 。子函數(shù)可以是 MATLAB 自帶的內(nèi)部函數(shù),也可以是自編的外部函數(shù);可以是以 function 打頭的函數(shù),也 可以是內(nèi)聯(lián)函數(shù)和匿名函數(shù)。 , 并且可以被同一個(gè)函數(shù)文件中的任意主函數(shù)和子函數(shù)調(diào)用 (也 就是說(shuō),它不可以被其他函數(shù)文件中的主函數(shù)或子函數(shù)調(diào)用 。通過(guò)子函數(shù),我們可以在一 個(gè)函數(shù)文件中編寫多個(gè)函數(shù), 并且實(shí)現(xiàn)相應(yīng)的功能。 例如, 我們想要編寫一個(gè)函數(shù)計(jì)算表達(dá) 式 z=x+x y的值,我們可以將根號(hào)連同根號(hào)內(nèi)的表達(dá)式寫成一個(gè)子函數(shù)。為此 我們分別編寫一個(gè)主函數(shù) mainfunction 來(lái)計(jì)算整個(gè)表達(dá)式的值,和一個(gè)子函數(shù) subfunction 來(lái)計(jì)算根號(hào)連同內(nèi)部表達(dá)式的取值(

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論