




已閱讀5頁(yè),還剩75頁(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)介
第5章MATLAB程序設(shè)計(jì) MATLAB作為一種應(yīng)用廣泛的科學(xué)計(jì)算軟件 不僅具有強(qiáng)大的數(shù)值計(jì)算 數(shù)據(jù)可視化功能 而且具有強(qiáng)大的程序設(shè)計(jì)功能 通過(guò)編寫(xiě)擴(kuò)展名為 m的M文件 用戶可以實(shí)現(xiàn)各種復(fù)雜的功能 且MATLAB語(yǔ)言語(yǔ)法簡(jiǎn)單 庫(kù)函數(shù)豐富 程序易于調(diào)試 極大方便了用戶的開(kāi)發(fā)過(guò)程 本章主要介紹MATLAB中的M文件 函數(shù)定義 類型 參數(shù)傳遞方法 程序控制結(jié)構(gòu) 代碼優(yōu)化方法和程序調(diào)試方法等 學(xué)習(xí)目標(biāo) 掌握MATLAB中腳本M文件和函數(shù)M文件的概念 掌握MATLAB中函數(shù)變量類型 函數(shù)參數(shù)傳遞方法 函數(shù)類型 函數(shù)句柄 掌握MATLAB中的程序流程控制語(yǔ)句 掌握MATLAB中的代碼優(yōu)化方法 掌握MATLAB中的程序調(diào)試方法 5 1M文件 1 概念MATLAB語(yǔ)言編寫(xiě)的程序文件稱為M文件 一個(gè)M語(yǔ)言文件就是由若干MATLAB的命令組合在一起構(gòu)成的 通過(guò)一個(gè)簡(jiǎn)單的指令就可以執(zhí)行這些命令 M語(yǔ)言文件是純文本格式的文件 其擴(kuò)展名為 m 2 M文件的創(chuàng)建通過(guò) File 菜單中 New 子菜單下的 M File 命令來(lái)啟動(dòng)meditor編輯器 直接單擊MATLAB用戶界面工具欄上的新建按鈕來(lái)啟動(dòng)meditor編輯器 3 M文件分類根據(jù)調(diào)用方式的不同分為兩類 1 獨(dú)立的M文件 腳本文件 ScriptFile 2 可調(diào)用的M文件 函數(shù)文件 FunctionFile 5 1 1腳本文件腳本M文件 將原本要在MATLAB環(huán)境下直接輸入的多條語(yǔ)句 存放在 m后綴的文件 這一文件稱為腳本文件 在命令行鍵入文件名 Matlab會(huì)打開(kāi)這一腳本文件 并執(zhí)行文件內(nèi)容 腳本文件不包含輸入?yún)?shù)和輸出參數(shù) 通常由M文件正文和注釋部分構(gòu)成 文件正文主要實(shí)現(xiàn)特定功能 而注釋是給出代碼說(shuō)明 便于閱讀 例5 1 腳本文件 g 0 0 5 20 創(chuàng)建一維向量X sin g y cos g z x y plot g z 以g為橫坐標(biāo) 繪制x y的圖形xlabel g ylabel x y 將例5 1的文件名存儲(chǔ)為example61 然后按下F5鍵或選擇Debug菜單的Run項(xiàng) 都可以運(yùn)行此腳本M文件 也可以在命令窗中輸入example61后回車(chē)即可運(yùn)行 程序運(yùn)行結(jié)束后 變量g x y和z均保存在基本工作空間中 可用命令whos查看 5 1 2函數(shù)M文件函數(shù)M文件 以固定格式書(shū)寫(xiě)的程序代碼 第一行以function開(kāi)始 是函數(shù)定義行 函數(shù)文件能夠接受用戶的輸入?yún)?shù) 進(jìn)行計(jì)算 并將計(jì)算結(jié)果作為函數(shù)的返回值返回給調(diào)用者 MATLAB提供的M語(yǔ)言函數(shù)文件是系統(tǒng)M文件 用戶自己利用M語(yǔ)言編寫(xiě)的文件為自定義函數(shù)文件 函數(shù)文件由5部分構(gòu)成 函數(shù)定義行H1在線幫助行函數(shù)幫助文本函數(shù)體注釋 1 函數(shù)定義行functiony fun x function為函數(shù)定義的關(guān)鍵字 fun為自定義的函數(shù)名 y為輸出參數(shù) x為輸入?yún)?shù) 即 輸出實(shí)參表 函數(shù)名 輸入實(shí)參表 注意 函數(shù)調(diào)用時(shí)各實(shí)參出現(xiàn)的順序 個(gè)數(shù) 應(yīng)與函數(shù)定義時(shí)形參的順序 個(gè)數(shù)一致 否則會(huì)出錯(cuò) function行中輸入輸出參數(shù)名可以和調(diào)用時(shí)的參數(shù)不同名 當(dāng)有多個(gè)變量輸入輸出時(shí) function y1 yn fun x1 x2 x3 當(dāng)不含輸出變量時(shí) 可以直接省略輸出部分或用空方括號(hào)表示 functionprintresults x function printresults x 2 H1行以 開(kāi)頭 在Matlab中不執(zhí)行 通常是幫助文本的第一行 他提供M文件的最重要信息 H1行可由helpfunction name命令顯示 也可以用lookfor命令顯示 3 函數(shù)幫助文本以 開(kāi)頭 用來(lái)比較詳細(xì)的說(shuō)明這一函數(shù) 也可以由helpfunction name命令顯示內(nèi)容 可以顯示從H1行到第一個(gè)不是以 開(kāi)頭的行為止 4 函數(shù)體是Matlab中要執(zhí)行的主程序 通常是用戶自己設(shè)計(jì)的M函數(shù) 5 注釋以 開(kāi)頭 可出現(xiàn)在函數(shù)的任意位置 也可以加在語(yǔ)句行之后 以便對(duì)文本進(jìn)行解釋 例5 2 函數(shù)M文件 編寫(xiě)函數(shù) 計(jì)算向量元素均值 functiony average x Function第一個(gè)字母不可以大寫(xiě) AVERAGE求向量元素的均值 語(yǔ)法 y average x 其中 x為向量 y為計(jì)算得到向量元素的均值 若輸入?yún)?shù)為非向量則出錯(cuò) 代碼行 m n size x 判斷輸入?yún)?shù)是否為向量if m 1 n 1 m 1 保存該文件 保存時(shí)函數(shù)名和文件名必須一致 否則 調(diào)用函數(shù)時(shí)需要使用文件名稱而非函數(shù)名稱 調(diào)用此函數(shù)時(shí)在命令窗口輸入如下命令 x 123 y average x y 2上述函數(shù)第一行為函數(shù)定義行 定義了函數(shù)名稱average 輸入變量x和輸出變量y 其中function為關(guān)鍵詞 其后黃色標(biāo)注行為在線幫助 紫色標(biāo)注為注釋行 白色字體是函數(shù)主題 規(guī)范函數(shù)的運(yùn)算過(guò)程 并指出輸出自變量的值 由于H1幫助行的特殊作用 所以用戶自定義M函數(shù)文件時(shí) 一定要編寫(xiě)相應(yīng)的h1幫助行 對(duì)函數(shù)進(jìn)行簡(jiǎn)明 扼要的說(shuō)明或解釋 若在命令窗口鍵入指令helpaverage 則 helpaverageAVERAGE求向量元素的均值語(yǔ)法 y average x 其中 x為向量 y為計(jì)算得到向量元素的均值若輸入?yún)?shù)為非向量則出錯(cuò) 例 length函數(shù)的調(diào)用 x 123 y 123 456 length x 向量的元素個(gè)數(shù)即為其長(zhǎng)度ans 3 length y 列數(shù)即為矩陣的長(zhǎng)度ans 3 腳本文件與函數(shù)M文件區(qū)別 1 腳本文件沒(méi)有輸入輸出參數(shù) 函數(shù)M文件有 2 腳本文件運(yùn)行中可以調(diào)用工作空間的數(shù)據(jù) 運(yùn)行中產(chǎn)生的所有變量為全局變量 函數(shù)文件不能調(diào)用工作空間的數(shù)據(jù) 運(yùn)行中產(chǎn)生的所有變量為局部變量 3 腳本文件可直接運(yùn)行 函數(shù)文件不能 只能調(diào)用 5 1 3函數(shù)變量 函數(shù)中的變量包括局部變量 全局變量和永久變量 函數(shù)中的所有變量除非特殊聲明外都是局部變量 這些變量存儲(chǔ)在該函數(shù)獨(dú)立的工作區(qū)中 與其他函數(shù)的變量及主工作區(qū)中的變量分開(kāi)存儲(chǔ) 當(dāng)函數(shù)調(diào)用結(jié)束時(shí) 這些變量隨之刪除 不保存在內(nèi)存中 并且 除了函數(shù)返回值 該函數(shù)不改變工作區(qū)中其他變量的值 全局變量是在不同的函數(shù)工作空間以及基本工作空間中可以被共享的變量 任何函數(shù)如果需要使用全局變量 則必須首先聲明 語(yǔ)法為 global變量名1變量名2 除局部變量和全局變量外 MATLAB中還有一種變量類型為永久變量 永久變量有如下特點(diǎn) 1 只能在M函數(shù)文件內(nèi)部定義 2 只有該變量從屬的函數(shù)能夠訪問(wèn)該變量 3 當(dāng)函數(shù)運(yùn)行結(jié)束時(shí) 該變量的值保留在內(nèi)存中 因此當(dāng)該函數(shù)再次被調(diào)用時(shí)可以再次利用這些變量 永久變量的定義方法為 persistent變量名1變量名2 5 1 4函數(shù)參數(shù) 1 確定函數(shù)參數(shù)數(shù)目當(dāng)調(diào)用一個(gè)函數(shù)時(shí) 所用的輸入變量和輸出變量的數(shù)目 在函數(shù)內(nèi)是確定的 函數(shù)nargin確定輸入變量個(gè)數(shù) 函數(shù)nargout確定輸出變量個(gè)數(shù) 例5 3 nargin函數(shù)和nargout函數(shù)的使用 根據(jù)函數(shù)輸入輸出參數(shù)數(shù)量執(zhí)行對(duì)應(yīng)的功能 function x0 y0 myplot x y npts angle sub MYPLOTPlotafunction MYPLOT x y npts angle sub book iLoveM Thefirsttwoinputargumentsare required theotherthreehavedefaultvalues ifnargin 5 sub 20 end ifnargin 4 angle 10 endifnargin 3 npts 25 end ifnargout 0plot x y elsex0 x y0 y end在上述函數(shù)中 函數(shù)可以接受2 5個(gè)參數(shù) 通過(guò)nargin確定函數(shù)輸入?yún)?shù)個(gè)數(shù) 并對(duì)缺少的參數(shù)賦予默認(rèn)值 利用nargout確定輸出參數(shù)的個(gè)數(shù) 如果輸出參數(shù)為0 則繪制圖形 不輸出任何值 否則輸出x0和y0的值 若輸出參數(shù)的個(gè)數(shù)與函數(shù)定義的輸出參數(shù)個(gè)數(shù)不一致時(shí) 將計(jì)算得到的前幾個(gè)輸出參數(shù)作為返回值 2 傳遞可變數(shù)目的參數(shù)函數(shù)varargin和varargout允許編程者輸入可變數(shù)目的變量給函數(shù)或者讓函數(shù)返回可變數(shù)目的變量 MATLAB封裝所有的輸入?yún)?shù)為單元數(shù)組 封裝所有的輸出參數(shù)為單元數(shù)組返回給調(diào)用者 例5 4 varargin函數(shù)的使用 function xmin ymin testvar varargin fork 1 length varargin x k varargin k 1 對(duì)單元數(shù)組varargin進(jìn)行訪問(wèn) y k varargin k 2 endxmin min x ymin min y 函數(shù)testvar可以調(diào)用具有不同數(shù)目的輸入?yún)?shù) 如下所示 a b testvar 23 15 48 65 42 23 a 1b 2上例函數(shù)testvar可以接受任意個(gè)數(shù)的輸入?yún)?shù) 并將所有輸入?yún)?shù)作為一個(gè)元胞數(shù)組 利用花括號(hào)和圓括號(hào)對(duì)數(shù)組元素進(jìn)行訪問(wèn) 實(shí)現(xiàn)了輸入?yún)?shù)的調(diào)用 例5 5 varargout函數(shù)的使用 function varargout testvar2 arrayin fork 1 nargoutvarargout k arrayin k Cellarrayassignment 單元數(shù)組賦值end函數(shù)testvar2返回?cái)?shù)組arrayin的每一行 如下所示 a 12 34 56 78 90 p1 p2 p3 p4 p5 testvar2 a p1 12p2 34p3 56p4 78p5 90 函數(shù)varargin和varargout可以出現(xiàn)在輸入輸出變量列表的末尾 函數(shù)調(diào)用時(shí)必須指定需要的輸入和輸出變量 如下所示 function out1 out2 example1 a b varargin function i j varargout example2 x1 y1 x2 y2 flag 5 1 5函數(shù)句柄 利用函數(shù)句柄可以實(shí)現(xiàn)對(duì)函數(shù)的間接調(diào)用 可以通過(guò)將函數(shù)句柄傳遞給其他函數(shù)實(shí)現(xiàn)對(duì)函數(shù)的操作 也可以將函數(shù)句柄保存在變量中 函數(shù)句柄通過(guò) 符號(hào)創(chuàng)建 語(yǔ)法為 fhandle functionname其中fhandle為函數(shù)句柄 functionname為函數(shù)名 函數(shù)句柄也可以通過(guò)創(chuàng)建匿名函數(shù)的方式創(chuàng)建 語(yǔ)法為 fhandle arglist expr其中expr為函數(shù)體 arglist為逗號(hào)分隔開(kāi)的輸入變量列表 例如 sqr x x 2創(chuàng)建了用于計(jì)算輸入變量平方的匿名函數(shù) 如果輸入變量為空 則arglist為空 t datestr now 匿名函數(shù)的輸入變量為空 通過(guò)函數(shù)句柄實(shí)現(xiàn)對(duì)函數(shù)的間接調(diào)用 其調(diào)用語(yǔ)法為 fhandle arg1 arg2 argN 其中fhandle為函數(shù)句柄 保存函數(shù)句柄 可使用單元數(shù)組 如下所示 trigFun sin cos tan plot trigFun 2 pi 0 01 pi 5 1 6函數(shù)類型 1 主函數(shù)通常M文件中的第一個(gè)函數(shù)為主函數(shù) 主函數(shù)后可以是任意數(shù)目的子函數(shù) 主函數(shù)可以被該文件之外的其他函數(shù)調(diào)用 主函數(shù)的調(diào)用通過(guò)存儲(chǔ)該函數(shù)的M文件的文件名調(diào)用 M文件的名稱一般與主函數(shù)的名稱保持一致 2 子函數(shù)M文件中可以包括多個(gè)函數(shù) 除主函數(shù)之外的其他函數(shù)稱為子函數(shù) 每個(gè)子函數(shù)以函數(shù)定義語(yǔ)句開(kāi)始 直至下一個(gè)函數(shù)的定義或文件的結(jié)尾 各個(gè)子函數(shù)以任意順序出現(xiàn) 但主函數(shù)必須最先出現(xiàn) 子函數(shù)沒(méi)有在線幫助 且只能被主函數(shù)或該文件內(nèi)的其他子函數(shù)調(diào)用 例5 8 主函數(shù)和子函數(shù) function avg med newstats u 主函數(shù) NEWSTATSFindmeanandmedianwithinternalfunctions n length u avg mean u n med median u n functiona mean v n 子函數(shù) Calculateaverage 計(jì)算平均 a sum v n functionm median v n 子函數(shù) Calculatemedian 計(jì)算中位數(shù) w sort v 沿著輸入?yún)⒘縱的不同維的方向 從小到大重新排列v中的元素 ifrem n 2 1m w n 1 2 elsem w n 2 w n 2 1 2 end當(dāng)在M文件中調(diào)用函數(shù)時(shí) 系統(tǒng)首先判斷是否為子函數(shù) 然后判斷是否為私有函數(shù) 最后判斷其是否為當(dāng)前目錄下的標(biāo)準(zhǔn)M文件函數(shù)或者系統(tǒng)內(nèi)置函數(shù) 3 嵌套函數(shù)函數(shù)體可以定義其他的函數(shù) 這種內(nèi)部函數(shù)稱為嵌套函數(shù) 當(dāng)M文件存在一個(gè)或多個(gè)嵌套函數(shù)時(shí) M文件中的所有函數(shù)必須以end結(jié)束 嵌套函數(shù)的語(yǔ)法如下所示 functionx A p1 p2 functiony B p3 end end每個(gè)函數(shù)可以嵌套多個(gè)函數(shù) 通常為平級(jí)嵌套結(jié)構(gòu)和多層嵌套結(jié)構(gòu) 例5 9 平級(jí)嵌套結(jié)構(gòu) functionx A p1 p2 functiony B p3 endfunctionz C p4 end end例中函數(shù)A嵌套了函數(shù)B和函數(shù)C 例5 10 多層嵌套結(jié)構(gòu) functionx A p1 p2 functiony B p3 functionz C p4 end end end例中函數(shù)A嵌套了函數(shù)B 函數(shù)B嵌套了函數(shù)C 一個(gè)嵌套函數(shù)可以被下列函數(shù)調(diào)用 1 該嵌套函數(shù)的上一層函數(shù) 2 同一母函數(shù)下的同級(jí)嵌套函數(shù) 3 被任一低級(jí)別的函數(shù)調(diào)用 4 私有函數(shù)私有函數(shù)是指位于private目錄下的M文件函數(shù) 私有函數(shù)的構(gòu)造與普通M函數(shù)完全相同 私有函數(shù)只能被private目錄的上一級(jí)目錄下的M函數(shù)文件調(diào)用 而不能被其他目錄下的任何M函數(shù) M腳本文件調(diào)用 也不能被上一級(jí)目錄下的M腳本文件調(diào)用 5 重載函數(shù)函數(shù)重載允許多個(gè)函數(shù)使用相同的函數(shù)名 不同的輸入變量數(shù)據(jù)類型 函數(shù)調(diào)用時(shí) 系統(tǒng)根據(jù)函數(shù)輸入變量的數(shù)據(jù)類型選擇對(duì)應(yīng)的函數(shù) 5 2MATLAB的程序控制結(jié)構(gòu) 程序流程控制包含控制程序的基本機(jī)構(gòu)和語(yǔ)法 結(jié)構(gòu)化的程序主要有以下幾種結(jié)構(gòu) 順序結(jié)構(gòu)條件控制循環(huán)控制誤差控制程序終止MATLAB的這些程序結(jié)構(gòu)與其他高級(jí)語(yǔ)言類似 使得MATLAB編程功能更加強(qiáng)大 5 2 1順序結(jié)構(gòu)語(yǔ)句 順序結(jié)構(gòu)最簡(jiǎn)單的程序結(jié)構(gòu) 系統(tǒng)在編譯程序時(shí) 按照程序的物理位置順序執(zhí)行 這種程序容易編制 但是結(jié)構(gòu)單一 能夠?qū)崿F(xiàn)的功能有限 5 2 2條件控制語(yǔ)句 在編寫(xiě)程序時(shí) 經(jīng)常需要根據(jù)不同的條件選擇運(yùn)行的命令 此時(shí)需要使用條件判斷語(yǔ)句進(jìn)行程序控制 MATLAB的條件判斷可以使用if語(yǔ)句或switch語(yǔ)句 1 if語(yǔ)句條件判斷語(yǔ)句為if語(yǔ)句 通常采用if else end分支結(jié)構(gòu) 包含單分支 雙分支和多分支三種形式 if語(yǔ)句的最簡(jiǎn)單結(jié)構(gòu)為 if邏輯表達(dá)式執(zhí)行代碼塊end如果邏輯表達(dá)式為真 則執(zhí)行if和end語(yǔ)句之間的代碼 如果邏輯表達(dá)式為假 則跳過(guò)if和end語(yǔ)句之間的代碼 例5 12 if語(yǔ)句的使用 ifrem a 2 0 rem為求余數(shù)的命令disp aiseven 顯示a是偶數(shù)b a 2 end當(dāng)邏輯表達(dá)式為一個(gè)空數(shù)組時(shí) MATLAB認(rèn)為條件為假 當(dāng)邏輯表達(dá)式為變量時(shí) 邏輯真的條件為變量非零 對(duì)于矩陣變量 則判斷矩陣的所有元素為非零 當(dāng)程序有兩個(gè)選擇時(shí) 可以使用if else end結(jié)構(gòu) 此時(shí)程序結(jié)構(gòu)為 if表達(dá)式執(zhí)行代碼塊1else執(zhí)行代碼塊2end當(dāng)表達(dá)式為真時(shí) 執(zhí)行代碼塊1 否則執(zhí)行代碼塊2 當(dāng)程序包含多個(gè)選擇時(shí) 可以使用elseif語(yǔ)句 結(jié)構(gòu)為 ifexpression1statements1elseifexpression2statements2elsestatements3end其中可以包含任意多個(gè)elseif語(yǔ)句 例5 13 if elseif else end語(yǔ)句的使用 functionifboth a b ifa 0 ifboth a b aandbarebothlargerthan0done 2 switch case分支語(yǔ)句MATLAB中的另一種多選擇語(yǔ)句為分支語(yǔ)句 分支語(yǔ)句的結(jié)構(gòu)為 switch表達(dá)式 標(biāo)量或字符串 case值1語(yǔ)句體1 當(dāng)表達(dá)式 值1時(shí) 執(zhí)行語(yǔ)句體1 然后跳出該結(jié)構(gòu)case值2語(yǔ)句體2 當(dāng)表達(dá)式 值2時(shí) 執(zhí)行語(yǔ)句體2 然后跳出該結(jié)構(gòu) otherwise語(yǔ)句體 當(dāng)表達(dá)式的值不等于前面所有檢測(cè)值時(shí) 執(zhí)行該語(yǔ)句體end 當(dāng)表達(dá)式等于值1時(shí) 執(zhí)行語(yǔ)句體1 當(dāng)表達(dá)式等于值2時(shí) 執(zhí)行語(yǔ)句體2 當(dāng)表達(dá)式的值不等于關(guān)鍵字case所列的值時(shí) 執(zhí)行otherwise后的語(yǔ)句體 由此可見(jiàn) 上述結(jié)構(gòu)體保證至少有一組命令會(huì)得到執(zhí)行 在switch語(yǔ)句中 程序僅僅執(zhí)行符合條件的case分支 例5 14 switch case語(yǔ)句的使用price input 請(qǐng)輸入商品價(jià)格 switchfix price 100 case 0 1 價(jià)格小于200 不打折rate 0 case 2 3 4 價(jià)格在200與500之間 3 折扣rate 3 100 case 5 6 7 8 9 10 價(jià)格在500與1000之間 5 折扣 rate 5 100 otherwiserate 10 100 EndPrice price 1 rate 當(dāng)多個(gè)條件使用一個(gè)case分支時(shí) 則需要使用元胞數(shù)組與之配合 case命令后面的檢測(cè)值可以是一個(gè)標(biāo)量或者一個(gè)字符串 還可以是一個(gè)單元數(shù)組 如果檢測(cè)值是一個(gè)單元數(shù)組 MATLAB將表達(dá)式的值和該單元數(shù)組中的所有元素進(jìn)行比較 如果單元數(shù)組中的某個(gè)元素和表達(dá)式的值相等 MATLAB認(rèn)為檢測(cè)結(jié)果為真 從而執(zhí)行與該檢測(cè)值相等的一組命令 switchvarcase1disp 1 case 2 3 4 多個(gè)條件使用一個(gè)case分支時(shí) 則需要使用元胞數(shù)組與之配合disp 2or3or4 case5disp 5 otherwisedisp somethingelse end 5 2 3循環(huán)控制語(yǔ)句 循環(huán)語(yǔ)句一般用于有規(guī)律的循環(huán)計(jì)算 能夠在很大程度上精簡(jiǎn)代碼 MATLAB中的循環(huán)語(yǔ)句有兩種 for語(yǔ)句和while語(yǔ)句 1 for語(yǔ)句for循環(huán)允許一組命令以固定和預(yù)定的次數(shù)重復(fù) for循環(huán)的結(jié)構(gòu)為 for循環(huán)變量 開(kāi)始值 增量 結(jié)束值執(zhí)行代碼塊end缺省增量為1 可以指定任意的增量 如果增量值為正 則當(dāng)循環(huán)變量大于結(jié)束值時(shí) 循環(huán)終止 如果增量值為負(fù) 則當(dāng)循環(huán)變量小于結(jié)束值時(shí) 循環(huán)終止 for循環(huán)可以嵌套使用 例5 15 for循環(huán)的嵌套form 1 5forn 1 100A m n 1 m n 1 endendfor循環(huán)的循環(huán)變量可以是行向量 也可以使用矩陣作為循環(huán)次數(shù)的控制變量 每一次循環(huán)k是矩陣A的列矢量 循環(huán)的次數(shù)為矩陣的列數(shù) fork Astatementsend 2 while循環(huán)for循環(huán)以固定次數(shù)執(zhí)行程序代碼 while循環(huán)以可變的次數(shù)執(zhí)行程序代碼 當(dāng)while的條件表達(dá)式為真時(shí) 執(zhí)行代碼塊 直到條件表達(dá)式為假 while語(yǔ)句的結(jié)構(gòu)為 while表達(dá)式執(zhí)行代碼塊end 例5 16 計(jì)算n 100的最大的n值 n 1 whileprod 1 n 100 prod函數(shù)用于計(jì)算向量所有元素的積 n n 1 end 5 2 4誤差控制語(yǔ)句 MATLAB為編程者提供了錯(cuò)誤處理語(yǔ)句try catch end語(yǔ)句 其語(yǔ)句結(jié)構(gòu)為 try運(yùn)行代碼塊1 總被執(zhí)行 若正確 則跳出此結(jié)構(gòu)catch運(yùn)行代碼塊2 僅當(dāng)運(yùn)行代碼塊1出現(xiàn)執(zhí)行錯(cuò)誤 運(yùn)行代碼塊2執(zhí)行end該語(yǔ)句執(zhí)行try中的程序代碼塊 如果遇到程序錯(cuò)誤則運(yùn)行catch中的程序代碼塊 如果程序運(yùn)行成功 則退出該try catch end語(yǔ)句 如果在catch和end之間的程序運(yùn)行出錯(cuò) 則程序運(yùn)行終止 或者如果存在其它的try catch end結(jié)構(gòu) 則運(yùn)行下一個(gè)try catch end結(jié)構(gòu) 可以利用lasterr命令查看發(fā)生錯(cuò)誤的原因 注意try和catch運(yùn)行代碼塊中的語(yǔ)句之間用逗號(hào)隔開(kāi) 例5 17 誤差控制語(yǔ)句的使用 n 4 A pascal 3 將3階帕斯卡矩陣賦給A tryA n A n catchA end A end endA end 136 lasterrans Indexexceedsmatrixdimensions 指數(shù)超過(guò)矩陣尺寸 5 2 5其他流程控制語(yǔ)句 在程序設(shè)計(jì)中通常需要提前終止循環(huán) 結(jié)束程序的運(yùn)行 顯示錯(cuò)誤信息等情況 MATLAB提供了continue break return echo error等語(yǔ)句 與前面介紹的語(yǔ)句相結(jié)合 更好地完成流程的控制 1 continue語(yǔ)句continue語(yǔ)句通常用在循環(huán)控制中 包括for循環(huán)和while循環(huán) 用于結(jié)束當(dāng)次循環(huán) 繼續(xù)執(zhí)行下一次循環(huán) 但是不結(jié)束當(dāng)前循環(huán) 一般continue語(yǔ)句與if語(yǔ)句相結(jié)合 當(dāng)滿足一定的條件時(shí) 執(zhí)行continue語(yǔ)句 例5 18 continue語(yǔ)句用于循環(huán)控制fid fopen magic m r 用指定 讀出 方式打開(kāi)文件 并賦予文件代號(hào)fid count 0 while feof fid 函數(shù)feof的邏輯非 若文件指針fid未讀到文件末尾則繼續(xù)循環(huán)line fgetl fid fgetl用于從格式文本文件讀取行ifisempty line strncmp line 1 strncmp用于字符串比較continueendcount count 1 enddisp sprintf dlines count 2 break語(yǔ)句break函數(shù)也用于循環(huán)控制 中斷當(dāng)前循環(huán) 與continue不同 break跳出當(dāng)前循環(huán) 不再執(zhí)行該循環(huán)的任何操作 例5 19 break語(yǔ)句用于循環(huán)控制fid fopen fft m r s while feof fid line fgetl fid ifisempty line break ends strvcat s line strvcat用于垂直連接字符串enddisp s 3 return語(yǔ)句return函數(shù)結(jié)束正在運(yùn)行的函數(shù) 返回到調(diào)用函數(shù) 經(jīng)常用于函數(shù)的末尾正常結(jié)束函數(shù)的運(yùn)行 也可以在某條件滿足時(shí)強(qiáng)行結(jié)束函數(shù)的運(yùn)行 4 error語(yǔ)句顯示出錯(cuò)信息并終止當(dāng)前函數(shù)的運(yùn)行 error函數(shù)的語(yǔ)法為 error message 類似的語(yǔ)句還有warning函數(shù) 二者區(qū)別在于warning函數(shù)顯示警告信息后程序仍繼續(xù)執(zhí)行 5 input語(yǔ)句input函數(shù)用來(lái)提示用戶從鍵盤(pán)輸入數(shù)值 字符串或數(shù)組等數(shù)據(jù) 并接收輸入值 input函數(shù)的語(yǔ)法為 user entry input prompt 在屏幕上顯示提示信息prompt 等待用戶的輸入 并將輸入賦給變量user entry user entry input prompt s 在屏幕上顯示提示信息prompt 等待用戶的輸入 并將輸入作為字符串賦給變量user entry 5 keyboard語(yǔ)句程序運(yùn)行時(shí)如果遇到keyboard函數(shù) 將停止文件的執(zhí)行并將控制權(quán)交給鍵盤(pán) 通過(guò)在提示符前顯示K來(lái)表示一種特殊狀態(tài) 在M文件中使用該函數(shù) 對(duì)程序的調(diào)試和在程序運(yùn)行中修改變量都很方便 7 pause語(yǔ)句該命令用于暫時(shí)中止程序的運(yùn)行 等待用戶按任意鍵繼續(xù)運(yùn)行 該函數(shù)在程序的調(diào)試過(guò)程和用戶需要查詢中間結(jié)果時(shí)使用 pause函數(shù)的語(yǔ)法為 pause 停止M文件的執(zhí)行 按任意鍵繼續(xù)pause n 中止執(zhí)行程序n秒后繼續(xù) n是任意整數(shù)pauseon 允許后續(xù)的pause命令暫時(shí)中止程序的運(yùn)行pauseoff 禁止后續(xù)的pause命令暫時(shí)中止程序的運(yùn)行 5 3MATLAB程序優(yōu)化 MATLAB提供了兩種方法進(jìn)行程序的優(yōu)化 一種通過(guò)Profiler工具 另一種通過(guò)tic和toc函數(shù)進(jìn)行 本節(jié)將介紹這兩種程序運(yùn)行分析的方法 并介紹程序優(yōu)化的常用方法 5 3 1通過(guò)Profiler進(jìn)行程序運(yùn)行分析 Profiler工具為MATLAB中的圖形用戶接口 用于分析程序運(yùn)行時(shí)各個(gè)部分所消耗的時(shí)間 輔助用戶進(jìn)行程序優(yōu)化 Profiler可以從以下幾個(gè)方面提供程序運(yùn)行信息 1 避免由于疏忽造成的非必要操作 2 替換運(yùn)行較慢的算法 選擇快速算法 3 通過(guò)存儲(chǔ)變量的方式避免重復(fù)計(jì)算 通過(guò)Profiler工具進(jìn)行程序運(yùn)行分析通常按以下步驟進(jìn)行 1 查看Profiler生成的通體報(bào)告 查找運(yùn)行時(shí)間最多的函數(shù)或調(diào)用最頻繁的函數(shù) 2 查看這些函數(shù)的詳細(xì)報(bào)告 查找其中運(yùn)行時(shí)間最多的語(yǔ)句或調(diào)用最頻繁的語(yǔ)句 3 確定在運(yùn)行時(shí)間最多的函數(shù)或代碼是否存在改進(jìn)的可能 4 單擊界面鏈接 打開(kāi)相應(yīng)文件進(jìn)行修改 5 重復(fù)進(jìn)行上述的分析 修改 直到得到滿意結(jié)果 下面介紹Profiler工具的具體使用 1 打開(kāi)ProfilerMATLAB中可以通過(guò)以下方式打開(kāi)Profiler 1 單擊MATLAB工具欄中的Profiler圖標(biāo) 激活Prolifer工具 2 對(duì)于在編輯器中打開(kāi)的M文件 選擇Tools OpenProfiler 3 在命令行窗口中輸入 profilerviewer 2 運(yùn)行ProfilerProfiler工具界面如圖6 1所示 在Runthiscode中輸入需要分析的命令或表達(dá)式 單擊startprofiling按鈕 開(kāi)始分析 3 查看分析結(jié)果分析完成后 Profiler會(huì)生成分析報(bào)告 包括總體報(bào)告和針對(duì)每個(gè)函數(shù)的詳細(xì)報(bào)告 總體報(bào)告中包括函數(shù)名 被調(diào)用次數(shù) 總運(yùn)行時(shí)間 函數(shù)單獨(dú)運(yùn)行時(shí)間 即不包含其子函數(shù)的運(yùn)行時(shí)間 及函數(shù)運(yùn)行時(shí)間的圖形顯示 如圖6 2所示 用戶可以單擊每列的標(biāo)題改變結(jié)果的排序方式 也可以單擊函數(shù)標(biāo)題查看該函數(shù)的詳細(xì)報(bào)告 函數(shù)詳細(xì)報(bào)告中包括該函數(shù)中每行代碼的被調(diào)用次數(shù)和運(yùn)行時(shí)間 并且可以顯示其中的子函數(shù) 函數(shù)列表等 如圖6 3所示 另外用戶可以單擊 Copytonewwindowforcomparingmultipleruns 將該結(jié)果保存至新的窗口中 用于修改代碼后進(jìn)行再次分析 比較 5 3 2通過(guò)tic和toc函數(shù)進(jìn)行程序運(yùn)行分析 如果只需要了解程序的運(yùn)行時(shí)間 或者比較一段程序在不同應(yīng)用條件下的運(yùn)行速度 可以通過(guò)計(jì)時(shí)器來(lái)進(jìn)行 計(jì)時(shí)器包含兩個(gè)函數(shù) tic和toc函數(shù) tic函數(shù)用于開(kāi)始計(jì)時(shí)器 toc用于關(guān)閉計(jì)時(shí)器 并計(jì)算程序運(yùn)行的總時(shí)間 計(jì)時(shí)器函數(shù)的語(yǔ)法為 ticanystatements 所需計(jì)時(shí)的程序代碼toct toc 保存計(jì)時(shí)時(shí)間 5 3 3程序優(yōu)化的常用方法 同樣的功能可以采用不同的編程方法實(shí)現(xiàn) 不同的編程方法運(yùn)行速度不同 本節(jié)將介紹一些提高M(jìn)文件執(zhí)行速度 優(yōu)化內(nèi)存管理的常用方法 包括循環(huán)向量化和數(shù)組內(nèi)存的預(yù)分配等 1 循環(huán)向量化MATLAB的一個(gè)缺點(diǎn)是當(dāng)對(duì)矩陣的單個(gè)元素作循環(huán)時(shí)運(yùn)算速度很慢 編程時(shí) 把循環(huán)向量化 不但能縮短程序的長(zhǎng)度 更能提高程序的執(zhí)行效率 由于MATLAB的基本數(shù)據(jù)類型為矩陣和向量 所以編程時(shí) 應(yīng)盡量對(duì)向量和矩陣編程 而不是對(duì)矩陣元素進(jìn)行編程 例5 20 向量化for循環(huán) loop mtic 開(kāi)始計(jì)時(shí)x 1 fork 1 1001y k log10 x x x 0 01 endtoc loopElapsedtimeis0 006188seconds vetcor loop mticx 1 0 01 10 y log10 x toc vector loopElapsedtimeis0 003630seconds 對(duì)比可得 編程時(shí)盡量不用循環(huán)語(yǔ)句 2 數(shù)組內(nèi)存預(yù)分配在for循環(huán)或while循環(huán)中 如果數(shù)組大小隨著循環(huán)而增加則會(huì)嚴(yán)重影響內(nèi)存的使用效率 如下面的代碼 tica 123 456 789 fori 1 100y i det a i endtoc運(yùn)行得 Elapsedtimeis0 100146seconds 該代碼首先創(chuàng)建變量x 其值為0 在for循環(huán)中 將其擴(kuò)展為長(zhǎng)度為100的一維數(shù)組 在每一次擴(kuò)展中 系統(tǒng)需要尋找更大的連續(xù)內(nèi)存區(qū)域 用于存放該數(shù)組 并將數(shù)組從原地址移動(dòng)到新地址中 該代碼可以通過(guò)下面的代碼實(shí)現(xiàn) tica 123 456 789 y zeros 1 100 fori 1 100y i det a i endtoc運(yùn)行 Elapsedtimeis0 002580seconds 在該代碼中 首先為數(shù)組x分配內(nèi)存區(qū)域 將x的所有元素賦值為0 這樣可以節(jié)約重新分配內(nèi)存的時(shí)間 提高程序的效率 MATLAB中 可以用于分配內(nèi)存的函數(shù)有zeros和cell 分別用于數(shù)值數(shù)組和單元數(shù)組分配內(nèi)存 用zeros為數(shù)組分配內(nèi)存時(shí) 如果數(shù)組的類型是double以外的類型 則應(yīng)利用下面的語(yǔ)句進(jìn)行 A zeros 100 int8 該語(yǔ)句為A分配100 100的int8類型的內(nèi)存 A int8 zeros 100 該語(yǔ)句為A分配100 100的double類型的內(nèi)存 再將其轉(zhuǎn)換為int8類型 3 其他方法1 對(duì)數(shù)組賦值時(shí)避免改變數(shù)組的類型或者數(shù)組大小 2 對(duì)實(shí)數(shù)進(jìn)行操作 盡量避免復(fù)數(shù)的操作 3 合理使用邏輯運(yùn)算符 4 避免重載MATLAB中的內(nèi)置函數(shù)和操作符 5 通常情況下函數(shù)的運(yùn)行效率高于腳本文件 6 load和save函數(shù)效率高于文件輸入輸出函數(shù) 5 4程序調(diào)試 MATLAB程序中的錯(cuò)誤包括語(yǔ)法錯(cuò)誤和邏輯錯(cuò)誤 語(yǔ)法錯(cuò)誤可以由編譯器檢測(cè) 在編寫(xiě)時(shí) 如果語(yǔ)法出現(xiàn)錯(cuò)誤 則編輯器會(huì)在錯(cuò)誤處標(biāo)志紅色彎曲下劃線 同時(shí)如果將鼠標(biāo)放置此處會(huì)顯示錯(cuò)誤內(nèi)容提示 或者當(dāng)下劃線為橙色時(shí) 表示此處語(yǔ)法正確
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 教師反思在提升教育教學(xué)效果中的作用探討試題及答案
- 心理學(xué)教育試題及答案
- 練習(xí)商務(wù)英語(yǔ)說(shuō)話的核心考點(diǎn)題目試題及答案
- 水滸傳25試題及答案
- 幼兒教育管理試題及答案
- 機(jī)械專碩考研試題及答案
- 科學(xué)分析樂(lè)理考試出題技巧試題及答案
- 教育教學(xué)創(chuàng)新與實(shí)踐試題及答案
- 社會(huì)工作比賽試題及答案
- 實(shí)驗(yàn)觀察大學(xué)化學(xué)考試試題及答案
- 2024年江西省氣象部門(mén)招聘考試真題
- 2025-2030中國(guó)生物計(jì)算市場(chǎng)研發(fā)創(chuàng)新及發(fā)展前景趨勢(shì)預(yù)測(cè)研究報(bào)告
- (二模)2025年深圳市高三年級(jí)第二次調(diào)研考試歷史試卷(含標(biāo)準(zhǔn)答案)
- 曳引式電梯知識(shí)培訓(xùn)課件
- 中國(guó)南水北調(diào)集團(tuán)水網(wǎng)發(fā)展研究有限公司招聘筆試題庫(kù)2025
- 貴港輔警考試題庫(kù)2024
- 閩教版新課標(biāo)三年級(jí)信息技術(shù)教案下冊(cè)
- 《加工工藝學(xué)》6-2成本分析
- GB/T 22465-2008紅花籽油
- GB/T 18705-2002裝飾用焊接不銹鋼管
- 巴菲特三大經(jīng)典演講之二-1998年佛羅里達(dá)大學(xué)商學(xué)院演講
評(píng)論
0/150
提交評(píng)論