第5章 MATLAB程序設(shè)計(jì).ppt_第1頁
第5章 MATLAB程序設(shè)計(jì).ppt_第2頁
第5章 MATLAB程序設(shè)計(jì).ppt_第3頁
第5章 MATLAB程序設(shè)計(jì).ppt_第4頁
第5章 MATLAB程序設(shè)計(jì).ppt_第5頁
已閱讀5頁,還剩75頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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ì)功能 通過編寫擴(kuò)展名為 m的M文件 用戶可以實(shí)現(xiàn)各種復(fù)雜的功能 且MATLAB語言語法簡(jiǎn)單 庫函數(shù)豐富 程序易于調(diào)試 極大方便了用戶的開發(fā)過程 本章主要介紹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中的程序流程控制語句 掌握MATLAB中的代碼優(yōu)化方法 掌握MATLAB中的程序調(diào)試方法 5 1M文件 1 概念MATLAB語言編寫的程序文件稱為M文件 一個(gè)M語言文件就是由若干MATLAB的命令組合在一起構(gòu)成的 通過一個(gè)簡(jiǎn)單的指令就可以執(zhí)行這些命令 M語言文件是純文本格式的文件 其擴(kuò)展名為 m 2 M文件的創(chuàng)建通過 File 菜單中 New 子菜單下的 M File 命令來啟動(dòng)meditor編輯器 直接單擊MATLAB用戶界面工具欄上的新建按鈕來啟動(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)境下直接輸入的多條語句 存放在 m后綴的文件 這一文件稱為腳本文件 在命令行鍵入文件名 Matlab會(huì)打開這一腳本文件 并執(zhí)行文件內(nèi)容 腳本文件不包含輸入?yún)?shù)和輸出參數(shù) 通常由M文件正文和注釋部分構(gòu)成 文件正文主要實(shí)現(xiàn)特定功能 而注釋是給出代碼說明 便于閱讀 例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后回車即可運(yùn)行 程序運(yùn)行結(jié)束后 變量g x y和z均保存在基本工作空間中 可用命令whos查看 5 1 2函數(shù)M文件函數(shù)M文件 以固定格式書寫的程序代碼 第一行以function開始 是函數(shù)定義行 函數(shù)文件能夠接受用戶的輸入?yún)?shù) 進(jìn)行計(jì)算 并將計(jì)算結(jié)果作為函數(shù)的返回值返回給調(diào)用者 MATLAB提供的M語言函數(shù)文件是系統(tǒng)M文件 用戶自己利用M語言編寫的文件為自定義函數(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行以 開頭 在Matlab中不執(zhí)行 通常是幫助文本的第一行 他提供M文件的最重要信息 H1行可由helpfunction name命令顯示 也可以用lookfor命令顯示 3 函數(shù)幫助文本以 開頭 用來比較詳細(xì)的說明這一函數(shù) 也可以由helpfunction name命令顯示內(nèi)容 可以顯示從H1行到第一個(gè)不是以 開頭的行為止 4 函數(shù)體是Matlab中要執(zhí)行的主程序 通常是用戶自己設(shè)計(jì)的M函數(shù) 5 注釋以 開頭 可出現(xiàn)在函數(shù)的任意位置 也可以加在語句行之后 以便對(duì)文本進(jìn)行解釋 例5 2 函數(shù)M文件 編寫函數(shù) 計(jì)算向量元素均值 functiony average x Function第一個(gè)字母不可以大寫 AVERAGE求向量元素的均值 語法 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)算過程 并指出輸出自變量的值 由于H1幫助行的特殊作用 所以用戶自定義M函數(shù)文件時(shí) 一定要編寫相應(yīng)的h1幫助行 對(duì)函數(shù)進(jìn)行簡(jiǎn)明 扼要的說明或解釋 若在命令窗口鍵入指令helpaverage 則 helpaverageAVERAGE求向量元素的均值語法 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 腳本文件沒有輸入輸出參數(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ū)中的變量分開存儲(chǔ) 當(dāng)函數(shù)調(diào)用結(jié)束時(shí) 這些變量隨之刪除 不保存在內(nèi)存中 并且 除了函數(shù)返回值 該函數(shù)不改變工作區(qū)中其他變量的值 全局變量是在不同的函數(shù)工作空間以及基本工作空間中可以被共享的變量 任何函數(shù)如果需要使用全局變量 則必須首先聲明 語法為 global變量名1變量名2 除局部變量和全局變量外 MATLAB中還有一種變量類型為永久變量 永久變量有如下特點(diǎn) 1 只能在M函數(shù)文件內(nèi)部定義 2 只有該變量從屬的函數(shù)能夠訪問該變量 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ù) 通過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)行訪問 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)行訪問 實(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)用 可以通過將函數(shù)句柄傳遞給其他函數(shù)實(shí)現(xiàn)對(duì)函數(shù)的操作 也可以將函數(shù)句柄保存在變量中 函數(shù)句柄通過 符號(hào)創(chuàng)建 語法為 fhandle functionname其中fhandle為函數(shù)句柄 functionname為函數(shù)名 函數(shù)句柄也可以通過創(chuàng)建匿名函數(shù)的方式創(chuàng)建 語法為 fhandle arglist expr其中expr為函數(shù)體 arglist為逗號(hào)分隔開的輸入變量列表 例如 sqr x x 2創(chuàng)建了用于計(jì)算輸入變量平方的匿名函數(shù) 如果輸入變量為空 則arglist為空 t datestr now 匿名函數(shù)的輸入變量為空 通過函數(shù)句柄實(shí)現(xiàn)對(duì)函數(shù)的間接調(diào)用 其調(diào)用語法為 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)用通過存儲(chǔ)該函數(shù)的M文件的文件名調(diào)用 M文件的名稱一般與主函數(shù)的名稱保持一致 2 子函數(shù)M文件中可以包括多個(gè)函數(shù) 除主函數(shù)之外的其他函數(shù)稱為子函數(shù) 每個(gè)子函數(shù)以函數(shù)定義語句開始 直至下一個(gè)函數(shù)的定義或文件的結(jié)尾 各個(gè)子函數(shù)以任意順序出現(xiàn) 但主函數(shù)必須最先出現(xiàn) 子函數(shù)沒有在線幫助 且只能被主函數(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ù)的語法如下所示 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)和語法 結(jié)構(gòu)化的程序主要有以下幾種結(jié)構(gòu) 順序結(jié)構(gòu)條件控制循環(huán)控制誤差控制程序終止MATLAB的這些程序結(jié)構(gòu)與其他高級(jí)語言類似 使得MATLAB編程功能更加強(qiáng)大 5 2 1順序結(jié)構(gòu)語句 順序結(jié)構(gòu)最簡(jiǎn)單的程序結(jié)構(gòu) 系統(tǒng)在編譯程序時(shí) 按照程序的物理位置順序執(zhí)行 這種程序容易編制 但是結(jié)構(gòu)單一 能夠?qū)崿F(xiàn)的功能有限 5 2 2條件控制語句 在編寫程序時(shí) 經(jīng)常需要根據(jù)不同的條件選擇運(yùn)行的命令 此時(shí)需要使用條件判斷語句進(jìn)行程序控制 MATLAB的條件判斷可以使用if語句或switch語句 1 if語句條件判斷語句為if語句 通常采用if else end分支結(jié)構(gòu) 包含單分支 雙分支和多分支三種形式 if語句的最簡(jiǎn)單結(jié)構(gòu)為 if邏輯表達(dá)式執(zhí)行代碼塊end如果邏輯表達(dá)式為真 則執(zhí)行if和end語句之間的代碼 如果邏輯表達(dá)式為假 則跳過if和end語句之間的代碼 例5 12 if語句的使用 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語句 結(jié)構(gòu)為 ifexpression1statements1elseifexpression2statements2elsestatements3end其中可以包含任意多個(gè)elseif語句 例5 13 if elseif else end語句的使用 functionifboth a b ifa 0 ifboth a b aandbarebothlargerthan0done 2 switch case分支語句MATLAB中的另一種多選擇語句為分支語句 分支語句的結(jié)構(gòu)為 switch表達(dá)式 標(biāo)量或字符串 case值1語句體1 當(dāng)表達(dá)式 值1時(shí) 執(zhí)行語句體1 然后跳出該結(jié)構(gòu)case值2語句體2 當(dāng)表達(dá)式 值2時(shí) 執(zhí)行語句體2 然后跳出該結(jié)構(gòu) otherwise語句體 當(dāng)表達(dá)式的值不等于前面所有檢測(cè)值時(shí) 執(zhí)行該語句體end 當(dāng)表達(dá)式等于值1時(shí) 執(zhí)行語句體1 當(dāng)表達(dá)式等于值2時(shí) 執(zhí)行語句體2 當(dāng)表達(dá)式的值不等于關(guān)鍵字case所列的值時(shí) 執(zhí)行otherwise后的語句體 由此可見 上述結(jié)構(gòu)體保證至少有一組命令會(huì)得到執(zhí)行 在switch語句中 程序僅僅執(zhí)行符合條件的case分支 例5 14 switch case語句的使用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)控制語句 循環(huán)語句一般用于有規(guī)律的循環(huán)計(jì)算 能夠在很大程度上精簡(jiǎn)代碼 MATLAB中的循環(huán)語句有兩種 for語句和while語句 1 for語句for循環(huán)允許一組命令以固定和預(yù)定的次數(shù)重復(fù) for循環(huán)的結(jié)構(gòu)為 for循環(huán)變量 開始值 增量 結(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語句的結(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誤差控制語句 MATLAB為編程者提供了錯(cuò)誤處理語句try catch end語句 其語句結(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該語句執(zhí)行try中的程序代碼塊 如果遇到程序錯(cuò)誤則運(yùn)行catch中的程序代碼塊 如果程序運(yùn)行成功 則退出該try catch end語句 如果在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)行代碼塊中的語句之間用逗號(hào)隔開 例5 17 誤差控制語句的使用 n 4 A pascal 3 將3階帕斯卡矩陣賦給A tryA n A n catchA end A end endA end 136 lasterrans Indexexceedsmatrixdimensions 指數(shù)超過矩陣尺寸 5 2 5其他流程控制語句 在程序設(shè)計(jì)中通常需要提前終止循環(huán) 結(jié)束程序的運(yùn)行 顯示錯(cuò)誤信息等情況 MATLAB提供了continue break return echo error等語句 與前面介紹的語句相結(jié)合 更好地完成流程的控制 1 continue語句continue語句通常用在循環(huán)控制中 包括for循環(huán)和while循環(huán) 用于結(jié)束當(dāng)次循環(huán) 繼續(xù)執(zhí)行下一次循環(huán) 但是不結(jié)束當(dāng)前循環(huán) 一般continue語句與if語句相結(jié)合 當(dāng)滿足一定的條件時(shí) 執(zhí)行continue語句 例5 18 continue語句用于循環(huán)控制fid fopen magic m r 用指定 讀出 方式打開文件 并賦予文件代號(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語句break函數(shù)也用于循環(huán)控制 中斷當(dāng)前循環(huán) 與continue不同 break跳出當(dāng)前循環(huán) 不再執(zhí)行該循環(huán)的任何操作 例5 19 break語句用于循環(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語句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語句顯示出錯(cuò)信息并終止當(dāng)前函數(shù)的運(yùn)行 error函數(shù)的語法為 error message 類似的語句還有warning函數(shù) 二者區(qū)別在于warning函數(shù)顯示警告信息后程序仍繼續(xù)執(zhí)行 5 input語句input函數(shù)用來提示用戶從鍵盤輸入數(shù)值 字符串或數(shù)組等數(shù)據(jù) 并接收輸入值 input函數(shù)的語法為 user entry input prompt 在屏幕上顯示提示信息prompt 等待用戶的輸入 并將輸入賦給變量user entry user entry input prompt s 在屏幕上顯示提示信息prompt 等待用戶的輸入 并將輸入作為字符串賦給變量user entry 5 keyboard語句程序運(yùn)行時(shí)如果遇到keyboard函數(shù) 將停止文件的執(zhí)行并將控制權(quán)交給鍵盤 通過在提示符前顯示K來表示一種特殊狀態(tài) 在M文件中使用該函數(shù) 對(duì)程序的調(diào)試和在程序運(yùn)行中修改變量都很方便 7 pause語句該命令用于暫時(shí)中止程序的運(yùn)行 等待用戶按任意鍵繼續(xù)運(yùn)行 該函數(shù)在程序的調(diào)試過程和用戶需要查詢中間結(jié)果時(shí)使用 pause函數(shù)的語法為 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)化 一種通過Profiler工具 另一種通過tic和toc函數(shù)進(jìn)行 本節(jié)將介紹這兩種程序運(yùn)行分析的方法 并介紹程序優(yōu)化的常用方法 5 3 1通過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 通過存儲(chǔ)變量的方式避免重復(fù)計(jì)算 通過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í)間最多的語句或調(diào)用最頻繁的語句 3 確定在運(yùn)行時(shí)間最多的函數(shù)或代碼是否存在改進(jìn)的可能 4 單擊界面鏈接 打開相應(yīng)文件進(jìn)行修改 5 重復(fù)進(jìn)行上述的分析 修改 直到得到滿意結(jié)果 下面介紹Profiler工具的具體使用 1 打開ProfilerMATLAB中可以通過以下方式打開Profiler 1 單擊MATLAB工具欄中的Profiler圖標(biāo) 激活Prolifer工具 2 對(duì)于在編輯器中打開的M文件 選擇Tools OpenProfiler 3 在命令行窗口中輸入 profilerviewer 2 運(yùn)行ProfilerProfiler工具界面如圖6 1所示 在Runthiscode中輸入需要分析的命令或表達(dá)式 單擊startprofiling按鈕 開始分析 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通過tic和toc函數(shù)進(jìn)行程序運(yùn)行分析 如果只需要了解程序的運(yùn)行時(shí)間 或者比較一段程序在不同應(yīng)用條件下的運(yùn)行速度 可以通過計(jì)時(shí)器來進(jìn)行 計(jì)時(shí)器包含兩個(gè)函數(shù) tic和toc函數(shù) tic函數(shù)用于開始計(jì)時(shí)器 toc用于關(guān)閉計(jì)時(shí)器 并計(jì)算程序運(yùn)行的總時(shí)間 計(jì)時(shí)器函數(shù)的語法為 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 開始計(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)語句 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)到新地址中 該代碼可以通過下面的代碼實(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)利用下面的語句進(jìn)行 A zeros 100 int8 該語句為A分配100 100的int8類型的內(nèi)存 A int8 zeros 100 該語句為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ò)誤包括語法錯(cuò)誤和邏輯錯(cuò)誤 語法錯(cuò)誤可以由編譯器檢測(cè) 在編寫時(shí) 如果語法出現(xiàn)錯(cuò)誤 則編輯器會(huì)在錯(cuò)誤處標(biāo)志紅色彎曲下劃線 同時(shí)如果將鼠標(biāo)放置此處會(huì)顯示錯(cuò)誤內(nèi)容提示 或者當(dāng)下劃線為橙色時(shí) 表示此處語法正確

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論