MATLAB程序設計與工程應用 課件 向軍 第1-5章 MATLAB程序設計基礎- 排序、索引和搜索_第1頁
MATLAB程序設計與工程應用 課件 向軍 第1-5章 MATLAB程序設計基礎- 排序、索引和搜索_第2頁
MATLAB程序設計與工程應用 課件 向軍 第1-5章 MATLAB程序設計基礎- 排序、索引和搜索_第3頁
MATLAB程序設計與工程應用 課件 向軍 第1-5章 MATLAB程序設計基礎- 排序、索引和搜索_第4頁
MATLAB程序設計與工程應用 課件 向軍 第1-5章 MATLAB程序設計基礎- 排序、索引和搜索_第5頁
已閱讀5頁,還剩205頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

MATLABProgrammingandEngineeringApplicationMATLAB程序設計與工程應用本書知識結構第1章MATLAB與程序設計1.1算法和程序了解計算機系統的基本組成,了解計算機系統中算法和程序的基本概念,典型程序設計語言的基本特點,掌握程序處理的兩種基本方式(編譯和解釋)及其特點。1.2MATLAB入門了解MATLAB的工作環境及基本操作,熟悉腳本命令和程序的基本概念,掌握創建、編輯、保存和運行腳本程序的基本操作方法。1.3MATLAB的內置函數了解內置函數的概念,了解MATLAB中提供的初等數學內置函數及其用法。1.4MATLAB的幫助系統了解MATLAB的幫助系統,熟悉進入幫助系統、獲取幫助的常用操作方法。1.1算法和程序計算機的硬件(Hardware)是電腦內部所有的組件設備,例如中央處理器CPU、主板、內存條、硬盤、顯示器和鍵盤等,軟件(Software)是與計算機系統操作有關的程序和文檔。程序(Program)通常指的是完成特定功能的一組命令序列以及所處理的數據,而文檔(Documentation)通常指的是與軟件開發、維護和使用有關的文字材料。程序設計又稱為編程(Programming),就是針對需要求解的問題,提出高效合理的算法,并選用一種合適的程序設計語言實現該算法。其中算法(Algorithm)是描述求解問題方法的操作步驟集合,而程序設計語言(ProgrammingLanguage)規定了書寫程序時允許使用的一組記號和一套語法規則。1.1算法和程序算法是描述求解問題方法的操作步驟。在描述一個算法時,所采用的基本元素主要有變量、賦值、分支、循環和過程等。其中,變量(Variable)代表算法需要處理的數據,一般用若干個英文字符構成的符號來表示,例如x、y1、TotalNum等。賦值就是將期望的數據作為變量的值保存到變量中,或者對變量中原來保存的數據值進行修改。在求解不同的問題時,算法的具體操作步驟和執行流程各不相同,但大多可以歸納為三種典型情況,即順序、分支和循環,稱為程序的基本結構。任何復雜的算法問題,都可以通過設置適當的變量,利用順序、分支和循環三種基本的執行流程及其組合來描述。1.1.1算法1.1算法和程序1.1.1算法1.1算法和程序1.1.1算法一個算法可以在另一個算法中使用,稱為調用(Call)。為正確調用指定的算法,需要規定一種固定的格式,稱為過程(Procedure)。過程是從解決復雜問題的大算法中抽取出來的,能夠實現相對獨立功能的小步驟。過程又稱為子程序(Subroutine)或函數(Function),而調用子程序的程序通常稱為主程序(MainFunction)。在主程序中調用子程序時,通常需要向子程序傳遞期望的參數,從而使子程序具有一定的通用性,能夠在同一個或多個算法中多次調用以實現相同或類似的功能。1.1算法和程序1.1.2程序設計語言低級程序設計語言包括機器語言和匯編語言。機器語言(MachineLanguage)是面向計算機的底層硬件,能直接被計算機識別和執行的程序設計語言。匯編語言(Assemblylanguage)又稱為符號語言(SymbolicLanguage),也是一種面向計算機底層硬件的語言。在匯編語言中,用便于人工閱讀和記憶的符號(助記符,Mnemonic)代替機器語言中用抽象的二進制代碼表示的指令。例如,用助記符MOV表示數據的移動操作,用ADD表示加法操作等。1.1算法和程序1.1.2程序設計語言高級程序設計語言與匯編語言相比,高級程序設計語言(簡稱高級語言)更接近自然語言,因而抽象度高,與具體計算機的相關度更低,求解問題的方法描述更為直觀。因此,用高級語言設計程序的難度大大降低。根據設計要求,可以將所有的高級語言分為過程式語言和非過程式語言。在過程式程序設計語言中,通過用一系列可以順序執行的運算步驟來描述相應的求解過程,而非過程式語言無法表示出求解過程順序執行的運算步驟。1.1算法和程序1.1.2程序的編譯和解釋高級語言和匯編語言程序都需要翻譯為計算機能識別的目標程序(機器語言),才能被計算機硬件識別、處理和執行。這一翻譯過程一般由專門的語言處理程序實現,例如匯編程序、編譯程序、解釋程序和相應的操作程序等。在各種語言處理程序中,編譯(Compile)和解釋(Interpret)是語言處理的兩種基本方式。在編譯方式下,首先根據算法編制相應的高級語言或匯編語言程序(稱為源程序),然后用專門的語言處理程序(編譯程序、匯編程序)翻譯為等價的目標程序,再由計算機硬件進行識別、存儲、處理和執行,源程序、編譯程序和匯編程序不參與目標程序的運行過程。1.2MATLAB入門MATLAB是一個功能十分強大的開發平臺,具有極其豐富的各種功能,在計算機程序設計、科學計算和數據分析、系統建模與仿真和幾乎所有行業(通信、自動控制、大數據、人工智能和機器學習、金融等)的工程實踐中都得到了極其廣泛的應用。與傳統的計算機語言相比,MATLAB在技術解決問題方面具有許多優勢。其中主要包括如下幾方面。

使用方便

平臺獨立性

MATLAB編譯器

豐富的預定義函數庫

設備獨立的繪圖功能

圖形化的用戶界面1.2MATLAB入門1.2.1MATLAB的工作環境1.2MATLAB入門1.2.2腳本和程序在MATLAB的命令行窗口可以直接輸入簡單的命令或者數學表達式,實現簡單的運算和操作。這些命令稱為腳本(Script)命令。如果需要實現復雜的運算功能,可以將腳本命令集中放到一個文件中,稱為腳本程序(ScriptProgram)。1.2MATLAB入門腳本命令在命令行窗口中的命令提示符“>>”后,輸入的各種命令和數據、變量、數學表達式和數學函數等,統稱為腳本命令。每條命令輸入完畢后回車,將立即得到執行,并在命令行的下面顯示執行結果,同時在工作區子窗口中顯示腳本命令創建的變量及變量的值或屬性等。因此說MATLAB是一種解釋型程序設計語言。三個常用的腳本命令——clc:清除命令行子窗口clear:清除工作區子窗口中的所有變量;closeall:關閉運行程序所創建和打開的所有圖形窗口。1.2MATLAB入門腳本程序的創建和保存將多個腳本命令集中放到一個文件中,即可得到腳本程序。MATLAB的腳本程序文件名默認以.m為后綴。在MATLAB中,可以通過如下幾種方法創建腳本程序。(1)單擊主頁選項卡上的新建腳本按鈕。此時將在主窗口中間自動打開編輯器子窗口,同時在主窗口的頂部出現編輯器、發布、視圖等標簽。在編輯器子窗口頂部有一個標簽untitled,這就是新創建的腳本程序文件。通過重復單擊主頁選項卡上的新建腳本按鈕,可以創建更多新的腳本程序文件,各新建的程序文件依次自動命名為untitled.m、untitled2.m等。每個程序文件對應一個標簽,并顯示在編輯器子窗口的頂部,如圖1-5所示。單擊某個程序文件的標簽,即可在編輯器子窗口中錄入編輯程序。1.2MATLAB入門1.2MATLAB入門(2)如果已經打開編輯器子窗口,通過依次單擊主窗口中編輯器選項卡上的新建、腳本命令,也可以創建腳本程序文件。每創建一個程序文件,都將在編輯器子窗口的頂部增加一個對應的選項卡標簽。通過以上兩種方法創建的腳本程序,只是顯示在編輯器子窗口中,并可以在其中編輯錄入程序。程序一旦做了修改或編輯,子窗口頂部的標簽后面將出現一個星號,表示程序文件還沒有保存到硬盤上。單擊主窗口中編輯器選項卡上的保存按鈕,即可實現程序文件的保存。默認保存到在當前文件夾子窗口中設置的當前文件夾中,也可以指定保存到其他位置,同時注意為程序文件起一個合適的文件名。在MATLAB中,腳本程序文件名的后綴默認為.m。1.2MATLAB入門(3)在當前文件夾子窗口中右擊,在彈出的快捷菜單中依次單擊新建、腳本菜單命令。創建的程序文件仍然依次自動命名為untitled.m、untitled2.m等,并同時保存在當前文件夾中,此時可以為程序文件起一個合適的文件名。在當前文件夾中雙擊所創建的程序文件名,即可在編輯器子窗口中打開文件并編輯錄入程序。(4)在命令行窗口輸入edit命令創建腳本程序。例如,輸入如下命令>>editmyprog將自動打開編輯器子窗口,其中程序文件名為myprog.m。如果未指定文件名,將打開一個名為untitledi.m的新程序文件,其中的i可以為2、3、4、…,取決于在當前編輯器子窗口中原來已經創建的程序文件個數。1.2MATLAB入門腳本程序的運行創建腳本程序并編輯完程序代碼后,利用編輯器選項卡上運行按鈕組中的工具按鈕可以實現程序的運行控制等,如圖1-7所示。單擊運行按鈕,直接啟動程序運行,也可以利用運行按鈕的下拉菜單命令實現斷點的設置和清除,以實現斷點運行和程序調試等。1.2MATLAB入門程序運行完畢后,程序中所有的變量都將出現在工作區子窗口,某些變量的運行結果也將同步顯示在命令行窗口。例如,新建腳本程序,并將其保存為prog1.m。在編輯器子窗口中打開該文件,并在其中輸入如圖1-10所示程序。運行程序后,將在工作區得3個變量a、b和c,同時在命令行窗口顯示運行結果。由于第1和第2條命令后面有分號,因此在命令行窗口只顯示變量c的值,而不顯示a和b變量的值。1.2MATLAB入門1.3MATLAB的內置函數作為一款科學計算工具,MATLAB提供了大量用于科學計算和各行業應用程序的庫函數,稱為MATLAB的內置函數。MATLAB中的數學運算內置函數主要包括如下幾類:初等數學函數庫:算術運算函數、三角函數、指數和對數函數等;線性代數函數庫:矩陣分解、線性方程求解、計算特征值或奇異值等;數值積分和微分方程求解函數庫:數值積分求解函數、常微分方程求解函數、偏微分方程求解函數等;傅里葉分析和濾波函數庫:實現傅里葉變換、卷積和數字濾波的函數。1.3MATLAB的內置函數1.3MATLAB的內置函數實例1-1MATLAB內置函數的使用調用MATLAB中的內置函數,實現如下計算:1.4MATLAB的幫助系統MATLABProgrammingandEngineeringApplicationMATLAB程序設計與工程應用本書知識結構3QASDRTFYGUML,;/第2章基本數據類型及運算2.1基本數據類型了解MATLAB程序中的基本數據類型,了解浮點數和整數的表示范圍及相互轉換方法,熟悉常用的常量符號。2.2變量及其屬性掌握MATLAB程序中變量的命名規則及其賦值方法,變量的屬性及其查看方法。2.3數組熟悉數組、向量和數值序列的概念及其創建方法,掌握數組元素的訪問及獲取數組大小的常用方法。第2章基本數據類型及運算2.4數據的基本運算了解MTALAB中對標量和數組的基本運算方法及區別,熟悉利用運算符實現算術運算和構成算術表達式的基本方法。2.5字符與字符串了解MATLAB程序中字符的編碼方法,掌握字符和字符串、字符向量與字符串數組的區別、聯系及其用法,熟悉字符串的各種基本運算和操作方法。2.6數據的輸入和輸出掌握MATLAB程序中實現數據輸入輸出的基本方法,熟悉常用的數值顯示格式,掌握數據格式化輸出的基本方法。在程序中,數據類型(DataType)是數據的屬性,用于為變量或者表達式規定可能的取值,定義數據在計算機內存中的存儲方式以及對數據可以進行的操作。在MATLAB中,基本的數據類型主要有數值型數據、邏輯型數據和字符串等,此外還提供了函數句柄、結構體、元胞數組等高級數據類型。本章首先介紹簡單的數值型數據類型以及MATLAB中重要的數組和向量。MATLAB程序中的數值有兩種基本的類型,即整數(Integer)和浮點數(Floating-pointnumber)。其中整數可以是有符號整數或無符號整數,而浮點數又包括單精度型(Single)和雙精度型(Double)兩種。各種數據類型的區別主要在于能夠表示的數據范圍和精度有所不同。2.1基本數據類型2.1.1整數2.1基本數據類型2.1.2浮點數(實數)2.1基本數據類型2.1.3常量2.1基本數據類型在MATLAB中規定了很多專用的標識符,用于代表固定的數據,稱為常量(Constant)。常用的常量名如下。pi:圓周率。inf:無窮大。典型的情況是一個非0正數除以0,結果為

;一個負數除以0,得到結果為-

,表示為-inf。eps:無窮小。MATLAB程序中能夠表示的最接近0的最小數值,近似為2-52或2.2204′10-16。NaN:不確定量,又稱為非數值量(NoraNumber),典型的情況如0除以0。2.2變量及其屬性在MATLAB腳本命令和腳本程序的各種語句和表達式中,用變量(Variable)來表示和給定運算所需的數據。每個變量代表一定的內存單元,變量值存儲在這些單元中,需要時可以從中讀取出來參加運算,或者將運算結果作為變量值,重新保存到對應的單元中。在MATLAB程序中,變量及其屬性不需要在使用前進行聲明。在程序中,每遇到一個新的變量,會自動創建該變量,并為其分配合適的存儲空間,這樣極大地簡化了MATLAB程序的編寫。2.2.1變量及其賦值程序中的每個變量都有唯一的標識符作為名字,稱為變量名。通過變量名對變量所在的單元及其中的數據進行訪問。變量的命名必須符合以下規則:變量名必須以字母開頭,后面可以是字母、數字、下畫線等,但不能有空格。例如my_Var1。變量名的長度不能超過63個英文字符。變量名不能用保留字,即在MATLAB中已經用作特殊用途的標識符。MATLAB中的變量名是大小寫敏感的,例如a1和A1是兩個不同的變量。2.2變量及其屬性2.2.1變量及其賦值為變量賦值的基本語法格式為:變量名=變量值需要說明以下幾點:執行上述語句或命令后,可以在工作區中立即看到變量名及對應的變量值。如果表達式后無分號,則執行后在命令行窗口立即顯示變量及變量值;如果有分號,則命令行窗口不會有任何顯示。如果在上述命令中沒有給定變量名,則將變量值賦給默認變量ans。通過在命令行窗口輸入clear命令或者執行程序中的clear語句,可以清除工作區中原來創建的變量。2.2變量及其屬性2.2.2變量的屬性通過在命令行窗口執行whos命令,可以按字母順序列出已經創建的所有變量的名稱(Name)、大小(Size)、占用內存單元字節數(Bytes)和數據類型(Class)等屬性。2.2變量及其屬性2.3.1數組的基本概念在計算機科學中,數組(Array)是由相同類型數據的集合所組成的數據結構,在內存中用一塊連續的區域來存儲。數組中的每個數據稱為元素(Element),各元素在內存中連續依次存放。數組中的各元素在數組中的位置用一個或者若干個整數指定,這些整數稱為下標(Subscript)。在下標中,每個整數對應一維,下標整數的個數稱為數組的維數(Dimension),維數為k的數組通常簡稱為k維數組。在MATLAB中,一維數組通常又稱為向量(Vector),其中只有一行的數組稱為行向量(RowVector),只有一列的數組稱為列向量(ColumnVector)。2.3數組2.3.1數組的基本概念2.3數組2.3.2數組的創建2.3數組一維和二維數組的創建

所有元素放在中括號中。

對于一維數組,各數據元素之間用空格或者逗號分隔。對于二維數組,同一行的各數據元素之間用空格或逗號分隔,各行之間用分號來分隔。2.3.2數組的創建2.3數組三維數組的創建

三維數組可以認為是由多個相同維數的二維數組構成。因此,為創建三維數組,可以首先創建二維數組,然后再進行擴展。創建第一頁創建第二頁2.3.2數組的創建2.3數組序列的生成

序列(Sequence)實際上是一個行向量,其中的各元素按照一定的規律而變化,例如相鄰的任意兩個元素之間的差都相等。

在MATLAB中,創建序列最基本的方法是用冒號運算符,其典型格式為

first:dis:last

其中first和last分別為序列的起始值和終止值;

dis為步長,即序列中相鄰兩個元素之間的差。2.3.2數組的創建2.3數組完整給出3個參數步長為默認值1步長可以為負三個參數可以為實數步長為默認值1三個參數可以為實數序列的生成2.3.2數組的創建2.3數組利用專用內置函數創建序列

y=linspace(a,b)

其中,參數a和b為序列的最最小值和最大值。

該語句執行后將返回一個行向量(序列),序列中的每個數據從a到b共100個,相鄰兩個元素之差都相等。調用該函數也可以再給定第三個參數n。當n為大于0的正整數時,將返回n個等差數據序列,相鄰兩個數據之間的差值為(b-a)/(n-1)。如果n為負整數,則返回一個空向量。2.3.2數組的創建2.3數組利用專用內置函數創建序列

y=logspace(a,b)

創建10a~10b之間的對數數值序列。顯然有:x1(1)=10x2(1)、x1(2)=10x2(2)

、…

2.3.2數組的創建2.3數組------------------------------------------------------------------實例2-1數組的創建用三種不同的方法創建向量a=[0,2,4,6,8,10]。方法1:在命令行窗口直接輸入如下命令: >>a=[0,2,4,6,8,10]方法2:利用數值序列的創建方法實現。在命令行窗口輸入如下命令: >>a=0:2:10方法3:調用linspace內置函數實現。 >>a=linspace(0,10,6)-----------------------------------------------------------------2.3.3數組元素的訪問2.3數組創建數組后,根據程序的需要可以訪問其中的指定元素。在MATLAB中,通過在數組名后添加一對小括號,并在小括號中依次列出需要訪問的元素的下標。例如,A(2)表示訪問一維數組A中的第2個元素,

而B(1,2)表示訪問二維數組B中第1行第2列的元素。2.3.3數組元素的訪問2.3數組需要說明以下幾點:在MATLAB中,數組各維的下標序號從1開始。由于數組中各元素在內存中是按列順序存放的,因此對多維數組,也可以與一維數組一樣,采用只有一個下標的方法進行訪問。

例如,對2′3數組A中的第2行第1列元素A(2,1),按照逐列順序存放時,該元素是A中的第3個元素,因此也可以表示為A(3)。在訪問數據和矩陣時,結合冒號表達式,可以同時訪問數組中的多個數據。2.3.3數組元素的訪問2.3數組例如,創建二維數組A:訪問A中第二行第1~4列的所有元素,得到向量B。訪問A中所有行第3列的所有元素,得到一個列向量。訪問A中第1行第2列到最后一列的所有元素,得到行向量C。2.3.4數組大小的獲取2.3數組數組的大小(Size)指的是一個數組中含有數據的總個數,也可以用各維中數據的個數表示。以二維數組為例,假設兩個維的長度分別為m和n,則數組中共有m×n個數據。size函數size函數的基本調用格式有如下2種:d=size(X)S=size(X,dim)第一種調用格式返回行向量d=[mn],其中的m和n分別表示二維數組X的行數和列數。參數dim指定數組X的維數,返回數組中該維的長度,保存到變量S中。2.3.4數組大小的獲取2.3數組length函數length函數用于返回數組中所有維的最大長度。如果數組為行向量或者列向量,返回結果也表示向量中數據的總個數。numel函數numel函數用于返回數組中所有元素的個數。對于二維數組,返回結果等于行數與列數的乘積。2.3.4數組大小的獲取2.3數組例如,假設X為3×2數組,則

>>d

=

size(X)

>>S1=

size(X,1)

>>L=length(X)

>>N=numel(X)執行結果如下:

d=

32 %數組X共有3行2列

S1=

3

%數組X第一維的長度為3,即行數為3

L=

2

%數組X中最后一維的長度,即列數為2

N=

6

%數組X中數據的總個數為62.4數據的基本運算MATLAB中的運算主要有算術運算、關系運算、邏輯運算等,每種運算都提供了相應的運算符,可以很方便地構成各種表達式。這里首先介紹常用的基本算術運算符。在MATLAB程序中,與能夠同時保存多個數據的數組不同,單個常數或者變量稱為標量(Scalar)。對標量和數組,在運算方法上有所不同,因此MATLAB中規定了不同的運算符。2.4數據的基本運算2.4.1標量運算2.4數據的基本運算運算符“\”和“/”分別稱為左除和右除運算,二者的區別在于表達式中被除數和除數書寫的位置。

例如,表達式5/2=2.5,而5\2=0.4。賦值運算符的作用是將常數或者表達式的值賦給左側的變量,運算符左側只能是一個變量,而不能是表達式。

例如,如下賦值表達式:

>>a+2=20

是錯誤的。2.4.1標量運算2.4數據的基本運算運算符的優先級。運算符的優先級用于確定計算表達式時各運算符代表的運算的順序。表2-3中各種算術運算符的優先級從高到低依次為:①

乘方運算(^);②

乘法(*)、右除(/)、左除(\);③

加法(+)、減法(-)。

其中,處于同一優先級的運算符將按照上述從左至右順序依次執行運算。

與普通的數學表達式一樣,利用括號可以改變上述默認的優先級順序。此外,對于比較復雜、含有運算符種類比較多的表達式,也建議適當地引入括號,以增強程序的可讀性。2.4.1標量運算2.4數據的基本運算數組中的每個元素也都是標量,因此用上述標量運算符也可以對其進行運算。例如,如下表達式:>>c=A(1,2)+B(2,2)*5將數組B中第二行第二列這所得元素乘以5,再與數組A中第一行第二列的元素相加,結果賦給變量c。由于數組中存儲的是多個同類型數據,在工程應用中,通常需要對數組中的所有數據執行相同的運算。為了簡化程序的編寫,MATLAB中提供了專門的數組運算符,對數組整體進行運算。這是MATLAB與大多數高級語言程序的主要區別之一。2.4.2數組的運算2.4數據的基本運算2.4.2數組的運算說

明:數組的加減運算與標量的加減運算符完全相同。實現的是將這兩個數組中所有對應位置上的兩個數據相加減,分別得到結果數組中的各元素。假設A和B中分別有10個元素,則表達式A+B實際上一共執行了10次加法運算。2.4數據的基本運算2.4.2數組的運算數組的乘除運算和乘方運算也是對數組中每個元素分別進行乘除運算和乘方運算,但為了與標量運算相區別,在前面加上一個“.”號。

例如,數組的乘方運算數組的除法運算2.4數據的基本運算2.4.2數組的運算兩個數組進行上述運算時,要求其維數和大小都必須相同。

例如:報錯:數組A和B數據個數不同,不能進行加法運算!2.4數據的基本運算2.4.2數組的運算一個數組也可以與標量進行運算,此時是將該標量與數組中的各數據分別進行運算。對乘方運算,必須用“.^”運算符,而其他運算用標量運算符和數組運算符都可以。

例如:2.4數據的基本運算2.4.2數組的運算實例2-2數組的運算創建數組a=[0,1,2;1,-1,1],b=[0,0,0;1,1,1],并利用MATLAB腳本命令實現如下運算,:(1)a+b,(2)(a+b)2,(3)2ab。2.5字符與字符串2.5.1字符及其編碼作為文本的各種文字符號統稱為字符(Character)。為了與表示大小的普通數值型數據相區別,在程序中一般用單引號括起來。例如,'A'、'中'。在計算機中,所有信息都必須用若干位二進制的組合進行表示和區分。對文本字符(例如十進制數字代碼字符、大小寫英文字母字符等),目前常用的方法是將每個字符用規定的8位二進制表示,稱為ASCII碼(AmericanStandardInformationExchangecode,美國標準信息交換碼)。在MATLAB中,字符都用Unicode編碼的格式保存到計算機的內存中。為了解決存儲效率問題,又出現了一些中間格式的字符集編碼,稱為Unicode轉換格式UTF(UnicodeTransformationFormat)。2.5字符與字符串2.5.1字符及其編碼ASCII碼上個世紀60年代,美國制定了一套字符編碼,對英文字符與二進制位之間的關系做了統一規定,稱為ASCII碼,一直沿用至今。ASCII碼一共規定了Windows鍵盤上128個字符的編碼,比如大寫字母A的ASCII碼為65,數字字符3的ASCII碼為51。英語用128個符號編碼就夠了,但是用來表示其他語言,128個符號是不夠的。例如,對簡體中文,常用的編碼方式是GB2312,在這種編碼方式中,使用兩個字節表示一個漢字,所以理論上最多可以表示256

256=65536個中文字符。2.5字符與字符串2.5.1字符及其編碼Unicode編碼由于不同國家的語言采用的編碼方式不同,同一個編碼可以被解釋成不同的符號。因此,要想打開一個文本文件,就必須知道其編碼方式。否則,如果用錯誤的編碼方式進行解讀,就會出現亂碼。如果有一種編碼,能夠將世界上所有的符號都納入其中,每一個符號都給予一個獨一無二的編碼,那么亂碼問題就會消失。這就是Unicode編碼。在Unicode編碼中,每個字符用1~4個字節表示。對英文字符,Unicode編碼與其ASCII碼相同,比如英文大小字母A的Unicode編碼和ASCII碼都為65。對漢字字符,其Unicode編碼為2~4個字節,例如漢字字符“中”的Unicode編碼為20013。2.5字符與字符串2.5.1字符及其編碼UTF編碼UTF編碼是Unicode編碼的一種實現方式,是一種可變長度的編碼方式,也就是對不同的字符用不同字節數的編碼。目前常用的有UTF-8和UTF-16等。UTF-8

使用1~4字節為每個字符編碼,其中大部分漢字采用3字節編碼,少量不常用漢字采用4字節編碼。UTF-16

使用2或4字節為每個字符編碼,其中大部分漢字采用2字節編碼,少量不常用漢字采用4字節編碼。MATLAB中采用UTF-16編碼。在MATLAB中,所有的字符都用Unicode編碼表示并存儲到計算機中。因此,對用單引號括起來的字符,在程序中實際上是代表其Unicode碼。2.5字符與字符串2.5.1字符及其編碼例如,創建數值型變量,默認為double型創建字符型變量,Class屬性為char普通數值型變量的運算字符型變量的運算,是將字符的Unicode編碼(ASCII碼)進行運算2.5字符與字符串2.5.2字符串與字符串數組由若干個字符可以構成字符串(String),在程序中可用于指定單個文本片段(文件名和繪圖標簽等)、顯示輸出運算結果,或者將已知的字符編碼數據表示為字符,從而便于在程序中輸入一些不能用鍵盤直接輸入的特殊字符(例如希臘字母、溫度符號字符)。在MATLAB中,字符串又可以有兩種不同的表示方法,分別稱為字符向量和字符串。2.5字符與字符串2.5.2字符串與字符串數組字符向量在MATLAB中,用單引號括起來的若干個字符稱為字符向量(CharacterVector)。在字符向量中,每個字符的Unicode編碼按順序依次存放到計算機內存中,相當于只有一行的數組。因此,與普通的數值型數組或向量一樣,利用下標可以訪問字符向量中指定的一個或多個字符。2.5字符與字符串2.5.2字符串與字符串數組字符向量在MATLAB中,用單引號括起來的若干個字符稱為字符向量(CharacterVector)。在字符向量中,每個字符的Unicode編碼按順序依次存放到計算機內存中,相當于只有一行的數組。因此,與普通的數值型數組或向量一樣,利用下標可以訪問字符向量中指定的一個或多個字符。2.5字符與字符串2.5.2字符串與字符串數組利用double函數將字符向量中的各字符轉換為對應的Unicode編碼。利用char函數將字符的編碼轉換為字符(向量)。2.5字符與字符串2.5.2字符串與字符串數組利用double函數將字符向量中的各字符轉換為對應的Unicode編碼。利用char函數將字符的編碼轉換為字符(向量)。2.5字符與字符串2.5.2字符串與字符串數組字符串從R2017a版本開始,MATLAB程序也允許用雙引號來創建字符串(String)。與字符向量不同,用雙引號包圍起來的字符串是一個整體。字符串是一個標量,不能單獨訪問其中的某個字符。2.5字符與字符串2.5.2字符串與字符串數組字符串數組用一對雙引號括起來的字符序列構成一個字符串標量。與普通的數值型數據一樣,多個字符串標量可以構成一個數組。數組中各元素分別都是一個字符串,則稱為字符串數組(StringArray)。2.5字符與字符串2.5.3文本與數值型數據之間的轉換字符和字符串統稱為文本(Text),這是與前面介紹的整數、浮點數等數值型數據類似的另一種數據類型。其基本區別在于,數值型數據一般都具有大小的概念,而文本一般不具有大小概念,只是對某種信息的符號代號,例如電話號碼、房間號、身份證號碼等。如果一個文本中全部是數字代碼字符0~9,在程序中經常需要將其轉換為數值型數據,以便進行特殊的處理變換,例如排序操作。或者相反,將數值型數據轉換為文本,以便實現顯示輸出等,例如將程序中的某個計算結果123送往計算機屏幕顯示。2.5字符與字符串2.5.3文本與數值型數據之間的轉換文本轉換為數值型數據字符向量或字符串標量轉換為數值標量常數字符串數組轉換為數值型數組2.5字符與字符串2.5.3文本與數值型數據之間的轉換在調用str2double函數實現轉換時,表示數值的文本可以包含數字、逗號(千位分隔符)、小數點、前導

+

-

符號,還可以是科學記數法中表示以10為底的專用字符e。如果文本中包含其他的非法字符,str2double

不能將文本轉換為數值,此時將返回

NaN

。2.5字符與字符串2.5.3文本與數值型數據之間的轉換數值型數據轉換為文本2.5字符與字符串2.5.4字符向量和字符串的基本操作字符串長度的獲取字符向量

字符向量實際上是普通的一維數組,其中的所有元素構成一個字符串。因此可以調用普通數組的操作函數size、length和numel以獲取其長度,返回的是其中字符的個數。字符串數組

由于其中的每個字符串元素都是一個整體或者說一個標量,因此用上述函數不是獲取其中每個字符串的長度,而是字符串數組中字符串的個數。

為了獲取字符串數組中各字符串的長度,必須調用strlength函數。2.5字符與字符串2.5.4字符向量和字符串的基本操作創建字符向量獲取各維的長度獲取字符向量第二維的長度(字符個數)獲取字符的個數創建字符串數組獲取數組的長度(字符串的個數)獲取數組中每個字符串的長度獲取數組中指定字符串的長度(字符個數)2.5字符與字符串2.5.4字符向量和字符串的基本操作字符串的連接和拆分字符向量的連接和合并實現字符向量的合并,最簡單的方法是將各字符向量按順序放到一對中括號中,各字符向量之間用空格或逗號分隔。比較:2.5字符與字符串2.5.4字符向量和字符串的基本操作字符串的連接和拆分字符串的連接和合并

對用雙引號括起來的多個字符串,還可以用加號實現連接和合并。字符串的連接和合并2.5字符與字符串2.5.4字符向量和字符串的基本操作用加法運算符可以實現多個字符串的合并連接,也可以實現字符串與數值常數或字符、字符向量的合并,得到一個新的字符串。如果一個表達式中所有項都是字符向量和常數,則不是進行字符串的合并連接,而是將各字符向量中對應字符的Unicode編碼與常數進行普通的相加運算,得到普通的數值型數組或向量。顯然在這種情況下,同一個表達式中所有字符向量都必須具有相同長度。2.5字符與字符串2.5.4字符向量和字符串的基本操作字符串數組的連接和合并實現數組中同一行多個字符串的合并指定合并時的分隔符指定按列合并2.5字符與字符串2.5.4字符向量和字符串的基本操作字符串的拆分指定拆分時的分隔字符,默認為空格。注意:split函數實現對字符串的拆分,得到若干子字符串。對字符向量,拆分后得到的是元胞數組,這將在后面介紹。2.5字符與字符串2.5.4字符向量和字符串的基本操作字符串的編輯2.5字符與字符串2.5.4字符向量和字符串的基本操作實例2-3字符串的編輯創建如下字符串:>>chr="HelloWorld" 之后,調用內置函數依次實現如下功能:(1)刪除chr字符串末尾的所有空格字符,得到字符串chr1;(2)將字符串chr1中的所有小寫字母替換為大寫字母,得到字符串chr2;(3)用chr和chr2構造2′1字符串數組chr3;(4)通過在各字符串末尾添加空格,使字符串數組chr3中所有字符串具有相同的長度。2.5字符與字符串2.5.4字符向量和字符串的基本操作創建字符串chr刪除尾隨空白字符串的合并小寫字母轉換為大寫字母為數組中的字符串添加尾隨空白,使兩個字符串長度相同2.6數據的輸入和輸出2.6.1數據的輸入根據程序流程的需要,在執行程序的過程,希望用戶從鍵盤上實時輸入參加運算的數據。x=?input(prompt)其中參數prompt為提示信息,可以是用單引號或者雙引號括起來的字符向量或者字符串。執行上述命令時,將在命令行窗口顯示參數prompt中的字符串,并等待用戶輸入值。輸入完畢后,按回車鍵,則將用戶輸入的數據存入變量x。2.6數據的輸入和輸出2.6.1數據的輸入執行input函數后,用戶可以輸入任何數值型常數、變量或者表達式。對輸入的變量或者表達式,返回結果為變量和表達式的值。如果需要文本字符串,必須在調用input函數時附加一個參數's'或者''s''。執行時,如果在提示信息后面不輸入任何信息直接回車,則返回結果為一個空數組(長度為0的數組)。2.6數據的輸入和輸出2.6.1數據的輸入執行一次該命令也可以輸入一個數組。此時,在提示信息后面依次輸入數組的各元素,各元素必須放在一對中括號中,各元素之間可以輸入空格、逗號或分號分隔。2.6數據的輸入和輸出2.6.2數據的輸出顯示在命令行窗口直接輸入變量名,或者將變量直接作為程序中的一行語句,則執行后將立即在命令行窗口顯示變量名及其數值。此外,MATLAB中還提供了專門的函數disp(x),用于顯示變量x的值,但是不顯示變量名稱。變量和數組的顯示2.6數據的輸入和輸出2.6.2數據的輸出顯示默認情況下,MATLAB使用5位短格式顯示數值。數值的顯示格式除此之外,用戶還可以根據需要自行指定其他顯示格式。設置數值的顯示格式可以使用

format

命令。執行該命令后,后面所有的變量值都將以指定格式顯示,直到再次執行format命令重新設置顯示格式。2.6數據的輸入和輸出2.6.2數據的輸出顯示2.6數據的輸入和輸出2.6.2數據的輸出顯示為使數據按照期望的格式進行輸出,同時顯示一些必要的提示信息,可以調用MATLAB中的內置函數fprintf。該函數的具體調用格式如下:fprintf(formatSpec,A1,...,An)

其中,

參數A1,...,An指定需要顯示輸出的變量或者數組,

參數

formatSpec

指定顯示輸出的格式,稱為格式字符串。數據的格式化輸出2.6數據的輸入和輸出2.6.2數據的輸出顯示格式字符串的作用是指定后面各變量值的顯示格式以及提示信息。格式字符串必須使用單引號或者雙引號括起來的字符向量或字符串,其中可以是普通的字符或特殊字符(例如換行符\n),還可以是以百分號開始的格式化操作符。普通字符將直接輸出顯示,而格式化操作符用于指定相應的顯示格式。格式化操作符必須以百分號開頭,后面緊跟格式說明字符,這些格式說明字符一般為規定的一個大寫或小寫字母。2.6數據的輸入和輸出2.6.2數據的輸出顯示2.6數據的輸入和輸出2.6.2數據的輸出顯示兩點說明——在格式操作符中可以附加標志、字段寬度和精度等參數,以便進一步定義輸出文本的格式。常用的附加標志有空格字符和字符0,空格字符指定在數值之前插入空格,字符0用于指定在數值之前補零以填充顯示數值的位數。

字段寬度用于指定顯示輸出數值的最低位數,一般為整數數字。當指定的字段寬度超過數值的有效位數時,在數值前面添加若干空格或0。

精度參數一般為小數,用于指定定點或科學記數法中小數的位數,或者緊湊型的定點或科學記數法中顯示數據的有效位數。2.6數據的輸入和輸出2.6.2數據的輸出顯示字段寬度精度附加標志空格附加標志0附加標志空格和02.6數據的輸入和輸出2.6.2數據的輸出顯示fprintf函數中的變量參數A1、A2等可以是數組,執行時將順序顯示數組中的各元素,每個元素與格式化字符串中的一個格式化操作符相對應。當數組元素的個數超過格式化操作符的個數時,將重復應用格式化字符串中的各格式化操作符顯示后面的各元素。MATLABProgrammingandEngineeringApplicationMATLAB程序設計與工程應用本書知識結構第3章MATLAB基本結構程序設計3.1面向過程程序設計簡介了解面向過程程序設計的基本概念。3.2邏輯數據類型及其運算掌握MALTAB程序中的邏輯數據類型,熟悉各種邏輯運算符和關系運算符以及邏輯表達式和關系表達式的構成和運算方法。3.3分支結構程序設計了解分支程序的基本結構,掌握if語句和switch語句的基本格式及實現程序分支的基本方法。3.4循環結構程序設計了解循環程序的基本結構,掌握for和while語句的基本格式及實現程序循環的基本方法,了解break和continue語句在循環程序的功能及其用法。面向過程程序設計就是面向解決問題的過程和步驟進行編程。傳統的面向過程的編程思想可以總結為“自頂向下,逐步細化”,程序設計的具體實現步驟可以簡單概括如下。將要實現的功能描述為一個從開始到結束按部就班的連續步驟(過程)。依次逐步完成這些步驟,并分別編寫相應的程序段。如果某一步的難度較大,又可以進一步細化為若干個子步驟,以此類推,直到得到想要的結果。上述步驟采用自頂向下的設計方法,將一個復雜的任務或者功能分解為很多更易理解和實現的子過程。每個子過程獨立進行程序編制和測試,直到確保每個子任務都能正常工作,再將這些子過程按照一定的程序結構組合起來實現完整的功能,所以又稱為結構化程序設計。3.1面向過程程序設計簡介在結構化程序設計中,有三種基本的程序結構,即順序結構、分支結構和循環結構。其中順序結構就是依次執行各子過程和步驟,當所有子過程執行完畢,就實現了整個程序的功能。在分支和循環結構的程序中,各子過程和步驟之間存在著執行流程的切換和跳轉,而一般來說,流程的切換和跳轉都需要有相應的條件進行控制。本章將主要介紹MALTAB中分支和循環結構的程序設計方法。3.1面向過程程序設計簡介3.2.1邏輯數據類型3.2邏輯數據類型及其運算在MATLAB中,邏輯數據可以用內置函數true和false產生,也可以由關系運算符構成的關系表達式和邏輯運算符構成的邏輯表達式產生。在計算機中,邏輯型數據的取值true和false分別用數值1和0表示和存儲,并可以和普通的數值型數據進行各種算術運算。3.2.2關系運算和邏輯運算3.2邏輯數據類型及其運算在程序中,關系通常指的是兩個數據之間的相對大小,關系運算就是比較判斷兩個變量或者數據的大小關系。邏輯運算是對一個或者多個邏輯型數據、邏輯型變量和關系表達式的結果進行運算。3.2.2關系運算和邏輯運算3.2邏輯數據類型及其運算關系運算符與關系表達式關系運算符用于構成關系表達式。利用關系表達式對兩個數值型常數和變量進行比較判斷,結果為邏輯型數值1或0,分別表示關系表達式成立(true)或者不成立(false)。關系表達式添加括號,明確指定優先級,以增強可讀性3.2.2關系運算和邏輯運算3.2邏輯數據類型及其運算幾點說明——關系表達式的結果用0和1表示,可以將其視為普通的數值型數據,并與其他普通型數據常數或變量進行算術運算。關系運算符的優先級

在同時含有算術運算和關系運算的表達式中,所有關系運算符的優先級相同,并且都低于所有算術運算符的優先級。因此,在關系表達式中需要注意添加小括號,以明確指定關系運算符的優先級順序。3.2.2關系運算和邏輯運算3.2邏輯數據類型及其運算數組的比較

關系表達式中的變量也可以是數組。用關系運算符對兩個數組進行比較,實際上是對兩個數組中對應位置上的元素進行比較,此時要求兩個數組的大小必須相同,結果是大小相同的邏輯型數組。3.2.2關系運算和邏輯運算3.2邏輯數據類型及其運算邏輯運算符與邏輯表達式邏輯運算符用于構成邏輯表達式,實現對邏輯型數據的與、或、非邏輯運算。輯運算符通常和關系運算符一起配合使用,用于構造比較復雜的關系比較和判斷。3.2.2關系運算和邏輯運算3.2邏輯數據類型及其運算3.2.2關系運算和邏輯運算3.2邏輯數據類型及其運算幾點說明——邏輯與和邏輯或運算都有兩種運算符,其中“&&”和“||”是具有短路功能的邏輯與和邏輯或運算。所謂短路功能,指的是在計算所有關系表達式之前就可完全確定邏輯表達式的結果。例如,在邏輯表達式A&&B中,如果關系表達式A=false(0),則根據運算規則,不管關系表達式B取值為0還是1,整個邏輯表達式的結果一定為false(0),因此不需要另外計算關系表達式B的值。3.2.2關系運算和邏輯運算3.2邏輯數據類型及其運算“&&”和“||”只能對兩個邏輯型標量數據或者能夠得到邏輯型標量數據的邏輯或關系表達式進行運算,而不能是邏輯型數組。邏輯非是一元運算符,只需要一個邏輯型變量或數據參與運算,而另外的三種運算符都需要兩個變量。在算術運算、關系運算和邏輯運算中,邏輯與和邏輯或運算符的優先級最低,而邏輯非的優先級要高于所有的算術和關系運算符。在邏輯與和邏輯或運算中,優先級從高到低依次為&、|、&&和||。3.2.2關系運算和邏輯運算3.2邏輯數據類型及其運算除了上述專用的運算符以外,MATLAB中還提供了專用的函數實現相應的邏輯運算,即and、or和not函數。此外,還可以調用xor函數實現邏輯異或運算,參加運算的邏輯型變量或數據分別作為這些函數的兩個或一個參數寫在小括號中。3.2.2關系運算和邏輯運算3.2邏輯數據類型及其運算字符串比較專用函數

函數strcmp(s1,s2)和strcmpi(s1,s2)用于比較兩個給定字符串s1和s2是否相同,函數strncmp(s1,s2,n)和strncmpi(s1,s2,n)用于比較兩個字符串的前n個字符是否相同。其中,函數strcmpi(s1,s2)和strncmpi(s1,s2,n)在比較時都不區分英文字母的大小寫。3.2.2關系運算和邏輯運算3.2邏輯數據類型及其運算字符類型和屬性的獲取

在MATLAB中,提供了如下內置函數用于判斷給定參數是否為字符向量和字符串,檢測字符串中指定字符的屬性(例如是否有英文字母等),返回邏輯值

1

(true)或者邏輯值

0

(false)。

函數ischar(x):確定參數x是否為字符向量;函數isstring(x):確定參數x是否為字符串;函數isletter():檢測字符或者字符串中哪些字符為英文字母,返回結果為一個行向量,向量中每個數據取值為1或0。當取值為1時,表示字符串中對應位置上的字符為英文字母。3.3.1if語句3.3分支結構程序設計基本的if語句if表達式1語句塊1endif表達式1語句塊1else語句塊2end單分支結構雙分支結構3.3.1if語句3.3分支結構程序設計if表達式1語句塊1elseif表達式2語句塊2else語句塊3end三分支結構3.3.1if語句3.3分支結構程序設計if表達式1語句塊1elseif表達式2語句塊2else語句塊3end三分支結構if語句最后一定以end命令結束。在上述語句中,還可以含有多個elseif,從而得到更多的分支。elseif是

else和

if兩個單詞拼接而成的,兩個單詞之間沒有空格。3.3.1if語句3.3分支結構程序設計實例3-1基本的分支程序判斷變量a中數的奇偶。如果該數為偶數,則將其除以2后賦給變量b;否則將變量b置為0。3.3.1if語句3.3分支結構程序設計實例3-2多分支結構程序設計從鍵盤上輸入一個0~100之間的整數。如果該數小于30,則屏幕提示“小”;大于80,則提示“大”;否則提示“中”。3.3.1if語句3.3分支結構程序設計if語句的嵌套所謂嵌套if語句,就是在基本if語句內部,還含有另外一層或者多層if語句。實例3-3if語句的嵌套1程序功能與實例3-2相同,要求用嵌套if語句實現。3.3.1if語句3.3分支結構程序設計實例3-4if語句的嵌套2有兩個長度可能不相等的行向量a和b,編程實現如下功能:在其中長度較小的向量后面補充若干個0,使兩個向量的長度相同,并顯示各種情況下的相關信息。運行結果3.3.2switch語句3.3分支結構程序設計switch開關表達式case表達式1語句塊1case表達式2語句塊2...otherwise語句塊Nendswitch語句逐一檢測各case子句中的表達式,直到其中的一個表達式成立,則執行該case子句下面的語句塊。如果case子句中的表達式為數值型數據,則當其等于開關表達式的值時,該case子句中的表達式成立。對于字符串,當case子句中的字符串表達式等于開關表達式中的字符串時,該表達式成立。3.3.2switch語句3.3分支結構程序設計實例3-5switch語句的使用根據鍵盤上輸入的字符A、B、C或D,分別顯示不同的信息。運行一次運行第二次3.4循環結構程序設計在一個程序中,當某個條件成立時,重復執行某些操作,這就是循環。許多實際問題都可以用循環結構的程序來實現某些重復操作,例如求很多數據的累加和連乘、重復執行指定的操作等。在循環程序的具體實現中,有兩種基本的循環,即計數循環和條件循環。3.4.1基本的循環語句3.4循環結構程序設計for索引=值

語句塊endfor語句索引即為循環計數變量,而值一般情況下是一個數組(可以是向量、數值序列或者多維數組)如果索引值是向量或者數值序列,則每次循環將向量中的一個元素賦給索引變量,循環次數等于向量的長度。索引值如果為二維數組,則每次循環可以將數組中的一列數據作為索引,此時索引變量是一個列向量,循環次數等于數組的列數。3.4.1基本的循環語句3.4循環結構程序設計實例3-6for語句的使用1求1~100之間所有奇數的累加和。運行結果3.4.1基本的循環語句3.4循環結構程序設計實例3-7for語句的使用2求數組中所有數據的累加和。運行結果3.4.1基本的循環語句3.4循環結構程序設計while表達式語句塊endwhile語句表達式可以是關系表達式或者邏輯表達式,代表繼續循環的條件。當表達式為true時,重復執行語句塊,直到表達式的值變為false。3.4.1基本的循環語句3.4循環結構程序設計實例3-8while語句的應用1任意輸入一個正整數n,用while循環求其階乘n!,編制相應的MATLAB程序。正整數n的階乘n!=1×2×3×…×n=n×(n-1)×(n-2)×…×2×1。因此根據輸入的正整數n進行運算,每次循環將n的值減1,并與前面的乘積相乘,直到n的值減到1為止。3.4.1基本的循環語句3.4循環結構程序設計實例3-9while語句的應用2整數向量a中按照從大到小的順序存放有若干數據,將各數據依次進行累加,當累加結果剛超過100時停止累加,求累加和及這些數據的平均值。3.4.2循環語句的嵌套3.4循環結構程序設計實例3-10循環語句的嵌套求數組中各行數據的最大值。3.4.3break和continue語句3.4循環結構程序設計這兩種語句主要用在for和while循環體中,一般與if語句配合使用。其中,break語句用于當滿足指定條件時終止執行循環,并跳過循環體中break語句之后的語句,繼續執行程序中該循環end語句之后的語句。如果是嵌套循環,break語句執行后將退出所在的循環,返回到外層循環中繼續執行。continue語句用于跳過當次循環時循環體中后面的其他語句,跳轉到所在循環體的開始,繼續執行所在循環體的下次循環。由此可見,break語句和continue語句的功能幾乎是完全相反的。3.4循環結構程序設計實例3-11continue語句的用法求出1~50之間7的所有倍數值。3.4.3break和continue語句3.4循環結構程序設計實例3-12break語句的用法利用break語句實現實例3-10中同樣的功能。3.4.3break和continue語句3.4循環結構程序設計3.4.4循環語句的向量化由于MATLAB中基本的數據類型是數組,并且提供了大量對數組進行操作和運算的運算符和函數,很多時候可以不用循環而直接實現。例如,兩個數組的加減乘法運算,實質上是數組中對應兩個元素的運算,可以根據這一原理用循環語句實現,這是在傳統的C語言等程序中實現的基本方法。在MATLAB中,只需要利用數組的加減乘運算符號,用一條語句就實現了。這就是循環語句的向量化。根據上述思想,MATLAB中還提供了一些內置函數,實現數組元素最大值、最小值和平均值等的求解,而不必自行編制循環結構程序來實現。這些都體現了MATLAB作為矩陣實驗室在編程思想上的改進。3.4循環結構程序設計實例3-13循環語句的向量化分別用循環語句和內置函數求數組中所有元素的最大值和平均值。3.4.4循環語句的向量化MATLABProgrammingandEngineeringApplicationMATLAB程序設計與工程應用本書知識結構第4章函數4.1函數的基本概念了解函數和函數文件的概念,函數文件的特點及其與腳本文件的區別。熟悉函數的基本結構,掌握函數聲明語句的基本格式。4.2函數的創建與調用掌握創建函數的基本方法,了解函數調用的概念,掌握MALTAB中函數調用的基本方法和常用格式。4.3局部函數、嵌套函數和匿名函數了解局部函數、嵌套函數和匿名函數的概念,各種函數的創建和使用方法。4.4函數之間的數據共享掌握函數之間數據共享的基本方法及其應用,熟悉局部變量、永久變量、全局變量的概念及用法上的區別。4.5函數的參數驗證了解函數參數驗證的概念,了解位置參數、可選位置參數、重復參數、名值對參數等概念,掌握各種參數的聲明及使用方法。在結構化程序中,函數又稱為子程序(Subroutine),是功能相對獨立、需要重復使用(調用)的一段程序代碼。與數學中函數的概念類似,程序中的函數一般有專門的函數名和若干個輸入輸出變量。4.1函數的基本概念4.1.1函數文件在MATLAB中,如果M文件中第一條可執行語句(除程序注釋以外的語句)以關鍵字function開始,該文件就成為函數文件(Functionfile)。函數文件具有如下特點:(1)一般情況下,每個函數文件中定義一個函數。這種情況下,文件名必須與函數名完全相同。與普通的腳本程序文件一樣,函數文件名的后綴仍然為.m。4.1函數的基本概念(2)在一個M文件中也可以同時定義多個函數,此時第一個函數是主函數,文件名必須是該主函數的函數名。在主函數或腳本代碼后面的函數稱為局部函數,只能在同一個文件內調用。有關局部函數的概念和用法將在后面介紹。(3)從R2016a版本開始,MATLAB也允許像其他高級語言程序一樣,將一個函數與調用函數的程序一起放在同一個文件中,此時函數必須放在調用該函數的程序后面。(4)與腳本程序不同的是,由于函數一般帶有入口參數,所以函數不能獨立運行,但可以在其他函數或者腳本程序中調用,也可以在命令行窗口通過給定入口參數進行調用。4.1函數的基本概念4.1.2函數文件的基本結構最基本的函數主要包括3部分,即函數聲明、函數體和end語句,此外還可以用程序注釋的形式(每行以“%”開頭)為函數添加必要的說明和幫助信息等。例如,下面的代碼定義了一個完整的函數:functionf=fact(n)%函數聲明,函數名,輸入輸出變量列表 %求n的階乘 %n必須為正整數 f=prod(1:n);%函數體end4.1函數的基本概念其中函數名為fact,該函數有一個入口參數n,函數將1~n的連乘結果保存到出口參數f中。(1)函數聲明:位于函數文件的首行。(2)函數體:實現該函數功能的MATLAB命令、接收輸入參數、實現程序流程控制等。(3)函數結束語句:在函數體的最后,利用end語句表示函數體的結束。(4)函數的幫助信息:在函數聲明行之后,函數體之前,可以利用注釋對該函數功能、輸入和輸出參數進行一些必要的簡單說明,如上述代碼中的第2和第3行。4.1函數的基本概念函數的聲明函數聲明的作用是定義函數名、函數的入口參數(輸入參數)和出口參數(輸出參數)。在MATLAB中,函數聲明語句以關鍵字function開頭,后面緊跟著的是函數的返回值列表(出口參數)和一個“=”符號。語句右側首先是函數的名稱,之后在小括號中列出函數的入口參數。函數聲明語句的基本格式如下:function[y1,...,yN]=myfun(x1,...,xM)其中,myfun為函數名,一般取有意義的英文單詞,必須以字母開頭,可以包含字母、數字或下劃線;x1,…,xM為輸入參數;y1,…,yN為輸出參數。4.1函數的基本概念幾點說明:(1)在函數文件中,函數聲明語句必須是函數文件中的第一條可執行語句,只可以在前面添加注釋語句等。保存文件時,函數文件名必須是函數名,并且以.m為后綴。(2)如果函數是定義在腳本文件的末尾,將與所在的腳本文件一起保存。此時,腳本文件名不能與文件中的函數具有相同的名稱。(3)函數可以沒有輸入參數,也可以有一個或多個輸入參數。所有的輸入參數必須放在一對小括號中,并用逗號隔開。如果沒有輸入參數,可以忽略函數名后的小括號。4.1函數的基本概念(4)函數的出口參數可以沒有,也可以有一個或者多個。如果沒有輸出參數,在函數聲明語句中可以將其忽略不寫,后面的“=”也不能寫。例如:functionmyFun(x)如果函數只有一個輸出參數,則在function關鍵字后面直接指定輸出參數的名稱。例如,如下函數只有一個輸出參數myOutput:functionmyOutput=myFun(x)如果函數有多個輸出參數,必須將所有的輸出參數寫在方括號中。例如,如下函數有3個輸出參數one、two和three:function[one,two,three]=myFun(x)4.1函數的基本概念函數體函數體是實現函數具體功能的語句塊,其中可以包括任何有效的MATLAB表達式、分支和循環結構程序段、注釋、空白行和嵌套函數。在函數體內可以根據需要創建新的變量,所有在函數體內創建的變量都存儲在該函數的工作區內,該工作區獨立于MATLAB的基礎工作區,稱為函數工作區。函數返回到調用該函數的主程序時,函數工作區自動關閉,其中的變量也不能再被訪問。此外,與普通的腳本程序一樣,函數體內的語句末尾如果有分號,則該語句的運算結果不會在命令行窗口顯示,該語句中創建的變量也不顯示在工作區。如果函數體內的某條語句沒有分號結尾,則語句執行的結果將顯示在命令行窗口,但所創建的變量仍然為局部變量,不會顯示在MATLAB的基礎工作區。4.1函數的基本概念

end語句函數體以end語句結束,也可以是遇到文件的末尾或者一個新的function聲明語句結束。只有當一個函數中有嵌套函數時,才需要在嵌套函數的最后使用end語句。但是為了增強程序的可讀性,最好還是將每個函數以end語句結束,并且與函數文件第一行的function關鍵字左對齊,函數體中的語句都縮進適當距離。4.2函數的創建與調用為創建一個新的函數,可以單擊MATLAB主頁選項卡中新建按鈕下的箭頭,在下拉菜單中選中函數菜單命令,即可打開MATLAB編輯器子窗口,在其中即可像普通的腳本文件一樣創建函數文件,如圖4-1所示。圖4-1MATLAB創建的函數文件4.2函數的創建與調用利用上述方法創建的函數文件,在形式上與普通的腳本文件主要有如下兩點區別:(1)新建的函數文件不是一個空白文件,其中已經自動添加了一些語句和代碼。第一條是函數聲明語句,其中定義了函數名untitled、函數的輸入參數inputArg1和inputArg2、輸出參數outputArg1、outputArg2等。(2)新建的函數文件自動命名為Untitled*.m。在定義了函數并保存文件時,自動以定義的函數名作為文件名。4.2函數的創建與調用定義函數文件并保存后,即可在命令行或者其他腳本命令、程序和函數文件中調用(Call)。調用時,將入口參數按照順序列在函數名后的小括號中,并根據需要將返回值賦給指定的變量。在函數定義中給定的輸入輸出參數稱為形式參數(簡稱形參,FormalParameter)。在調用時,必須根據形參的要求,將正確的參數值作為實在參數(簡稱實參,ActualParameter)傳遞給函數。函數體接收到這些實參值后,執行相應的功能和操作,并將運算結果通過輸出參數返回。4.2函數的創建與調用--------------------------------------------------------------------------------------------------------實例4-1函數的創建與調用創建MATLAB函數實現排列問題的求解。已知排列數的計算公式為--------------------------------------------------------------------------------------------------------首先在MATLAB中新建腳本,并在打開的編輯器子窗口中定義如下函數:%文件名:pnr.mfunctionp=pnr(n,r)

p1=1;p2=1

fori=1:n%求n!

p1=p1*i;

end

fori=1:n-r%求(n-r)!

p2=p2*i;

end

p=p1/p2;%求排列數end該函數名為pnr,因此保存文件時,文件將自動命名為pnr.m。上述函數文件保存后,在命令行窗口輸入如下命令即可調用執行:>>pnr(5,2)ans=

204.2函數的創建與調用出口參數的寫法有如下三種情況:(1)只有一個出口參數的情況例如,如下語句定義了一個函數average:

functiony=average(x)

y=sum(x)/length(x);

end在命令行或者其他文件中,可以用如下腳本命令調用上述函數:

>>z=1:99;

%創建一個行向量z

>>average(z)

%將z作為輸入參數,調用上述函數求其中所有元素的平均值

ans=

504.2函數的創建與調用出口參數的寫法有如下三種情況:(2)有多個出口參數的情況例如,如下語句定義了一個函數stat:function[m,s]=stat(x)n

溫馨提示

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

評論

0/150

提交評論