書名: MATLAB/Simulink建模與仿真作者名: 張德豐編著本章字數: 3700字更新時間: 2019-01-01 12:45:20
1.4 MATLAB
MATLAB是一門計算語言,它的運算指令和語法基于一系列基本的矩陣運算以及它們的擴展運算,它支持的數值元素是復數,這也是 MATLAB 區別于其他高級語言的最大特點之一,它給許多領域的計算帶來了極大方便。因此,為了更好地利用 MATLAB 語言的優越性和簡捷性,首先需要對 MATLAB 的數值類型、數組矩陣的基本運算、符號運算、關系運算和邏輯運算進行介紹,并給出相應示例,本部分內容是后面章節的基礎。
1.4.1 MATLAB的數值類型
MATLAB包括4種基本數據類型,即雙精度數組、字符串數組、元胞數組、構架數組。數值之間可以相互轉化,這為其計算功能開拓了廣闊空間。
1.變量與常量
變量是數值計算的基本單元。與 C 語言等其他高級語言不同,MATLAB 語言中的變量無須事先定義,一個變量以其名稱在語句命令中第一次合法出現而定義,運算表達式變量中不允許有未定義的變量,也不需要預先定義變量的類型,MATLAB會自動生成變量,并根據變量的操作確定其類型。
(1)MATLAB變量命名規則
MATLAB中的變量命名規則如下:
① 變量名區分大小寫,因此A與a表示的是不同的變量;
② 變量名以英文字母開始,第一個字母后可以使用字母、數字、下畫線,但不能使用空格和標點符號;
③ 變量名長度不得超過31位,超過的部分將被忽略;
④ 某些常量也可以作為變量使用,如i在MATLAB中表示虛數單位,但也可以作為變量使用。
常量是指那些在MATLAB中已預先定義其數值的變量,默認的常量如表1-4所示。
表1-4 MATLAB默認常量

(2)MATLAB變量的顯示
任何MATLAB語句的執行結果都可以在屏幕上顯示,同時賦值給指定的變量,沒有指定變量時,賦值給一個特殊的變量ans,數據的顯示格式由format命令控制。format只影響結果的顯示,不影響其計算與存儲。MATLAB 總是以雙字長浮點數(雙精度)來執行所有的運算。如果結果為整數,則顯示沒有小數;如果結果不是整數,則輸出形式如表1-5所示的幾種形式。
表1-5 MATLAB的數據顯示格式

(3)MATLAB變量的存儲
工作空間中的變量可以用save命令存儲到磁盤文件中。輸入命令“save<文件名>”,將工作空間中全部變量存到“<文件名>.mat”文件中去,若省略“<文件名>”則存入文件“matlab.mat”中;命令“save<文件名><變量名集>”將“<變量名集>”指出的變量存入文件“<文件名>.mat”中。
用命令load可將變量從磁盤文件讀入MATLAB工作空間,其用法為“load<文件名>”,它將“<文件名>”指出的磁盤文件中的數據依次讀入名稱與“<文件名>”相同的工作空間中的變量中去。若省略“<文件名>”則“matlab.mat”從中讀入所有數據。
用clear命令可從工作空間中清除現存的變量。
2.字符串
字符是MATLAB中符號運算的基本元素,也是文字等表達方式的基本元素,在MATLAB中,字符串作為字符數組用單引號(’)引用到程序中,還可以通過字符串運算組成復雜的字符串。字符串數值和數字數值之間可以進行轉換,也可以執行字符串的有關操作。
3.元胞數組
元胞是元胞數組(Cell Array)的基本組成部分。元胞數組與數字數組相似,以下標來區分,單元胞數組由元胞和元胞內容兩部分組成,用花括號{}來表示元胞數組的內容,用圓括號()表示元胞元素。與一般的數字數組不同,元胞可以存放任何類型、任何大小的數組,而且同一個元胞數組中各元胞的內容可以不同。
【例1-7】元胞數組創建與顯示示例。
在M文件編輯器中輸入以下命令:
A(1,1)={'An example of cell array'}; A(1,2)={[1 2;3 4]}; A{2,1}=tf(1,[1,7]); A{2,2}={A(1,2);'This is an example'}; celldisp(A)
元胞數組A第1行用元胞數組標志法建立一個字符串和一個矩陣;第2行用元胞內容編址法,建立一個傳遞函數和一個由兩個元素組成的元胞組,該元胞組分別是矩陣和字符串,最后,用celldisp函數顯示該元胞數組A。
在命令窗口顯示結果為:
A{1,1} = An example of cell array A{2,1} = tf object: 1-by-1 A{1,2} = 1 2 3 4 A{2,2}{1}{1} = 1 2 3 4 A{2,2}{2} = This is an example
4.構架數組
與元胞數組相似,構架數組(Structure Array)也能存放各類數據,使用指針方式傳遞數值。構架數組由結構變量名和屬性名組成,用指針操作符“.”連接結構變量名和屬性名。例如,可用parameter.temperature表示某一對象的溫度參數,用parameter.humidity表示某一對象的濕度參數等,因此,該構架數組parameter由兩個屬性組成。
5.對象
面向對象的 MATLAB 語言采用了多種對象,如自動控制中常用的傳遞函數模型對象(tf object)、狀態空間模型對象(ss object)和零極點模型對象(zpk object),一些對象之間可以相互轉換,例如可以從傳遞函數模型對象轉化為零極點模型對象,這將在后面具體介紹。
1.4.2 MATLAB的矩陣運算
MATLAB 語言最初是由專門用于矩陣運算的計算機語言發展而來的。MATLAB 語言最重要、最基本的功能就是進行實數或復數矩陣的運算,其所有的數值計算功能都是以矩陣(或數組)為基本單元來實現的,尤其是在 MATLAB 圖形圖像處理、信號處理和控制理論等方面涉及大量的矩陣運算。矩陣運算和數組運算在形式上有很多相似之處,但是在 MATLAB 中二者的運算性質是不同的,數組運算強調的是元素對元素的運算,而矩陣運算則采用線性代數的運算方式。讀者不要把二者混為一談,以免產生一些不可預期的錯誤。本節將重點介紹矩陣運算。表1-6列出了矩陣和數組的常用運算操作。
表1-6 常用的數組和矩陣操作運算

注:A、B為矩陣,S為標量。
1.矩陣的基本操作
(1)元素的提取
在矩陣操作中常常要獲取矩陣中某個特殊元素,在MATLAB中可以通過A(row, column)或者A(n)來提取單個元素,獲取矩陣的部分元素可以采用冒號運算符方法,具體如下。
A(:)為A的所有元素。
A(:,:)為二維矩陣A的所有元素。
A(:,k)為A的第k列,A(k,:)為A的第k行。
A(k:m)為A的第k~m個元素。
A(:,k:m)為A的第k~m列組成的子矩陣。
【例1-8】對于范德蒙矩陣A有:
>> a=[1 2 3]; >> b=vander(a) b= 1 1 1 4 2 1 9 3 1 >>b(3,1) %獲得范德蒙矩陣b的第3行、第1列處的元素 ans = 9 %其中n為索引,因為矩陣中的元素是按列存儲的,即149123111這樣的序列 >> b(5) ans = 2
【例1-9】獲取矩陣b的多個元素。
>> b=hilb(4) b= 1.0000 0.5000 0.3333 0.2500 0.5000 0.3333 0.2500 0.2000 0.3333 0.2500 0.2000 0.1667 0.2500 0.2000 0.1667 0.1429 >> c=b(1,4)+b(2,4)+b(3,4)+b(4,4) c= 0.7595 >>d=sum(b(1:4,4)) %提取矩陣的多個元素 d= 0.7595 >>f=sum(b(:)) %求所有元素之和 f= 5.0762
(2)矩陣的的轉置
矩陣的轉置在控制理論等問題里使用比較廣泛,矩陣的轉置與數組的轉置操作是不一樣的,在MATLAB中提供矩陣轉置操作符為“‘”,而數組轉置操作符為“.’”。
【例1-10】試比較矩陣的轉置與數組的轉置。
>> a=[1 3;1i 3i]; >>b=a' %矩陣轉置 b= 1.0000 0-1.0000i 3.0000 0-3.0000i >>c=a.' %數組轉置 c= 1.0000 0+1.0000i 3.0000 0+3.0000i
(3)矩陣的縮放
① 矩陣的擴大。當將數據保存在矩陣的元素之外時,矩陣將會自動增大空間來保存這個新增的元素。
【例1-11】矩陣的縮放示例。
>> A=eye(3) A= 1 0 0 0 1 0 0 0 1 >> A(2,4)=8 A= 1 0 0 0 0 1 0 8 0 0 1 0
② 矩陣的縮小。我們可以通過將行或列指定為空數組[],從而刪除矩陣中的行或列。但是不能從矩陣中刪除單個元素。
【例1-12】矩陣的縮小示例。
>> B=rand(3) B= 0.9501 0.4860 0.4565 0.2311 0.8913 0.0185 0.6068 0.7621 0.8214 >> B(2,3)=[] ??? Indexed empty matrix assignment is not allowed. >> B(:,3)=[] B= 0.9501 0.4860 0.2311 0.8913 0.6068 0.7621
(4)獲取矩陣的信息
在矩陣數值運算的時候常常要涉及矩陣的相關信息,MATLAB提供了表1-7中常用的幾個函數來獲取矩陣的信息。
表1-7 獲取矩陣信息的常用函數

【例1-13】應用矩陣信息函數示例。
>> C=rand(3); >> length(C) ans = 3 >> size(C) ans = 3 3 >> ndims(C) ans = 2
2.求特殊矩陣
這里將介紹一些在 MATLAB 中常用到的特殊矩陣以及稀疏矩陣,在控制理論中經常要用到這些矩陣。
(1)零矩陣和全1矩陣
MATLAB提供zeros()和ones()兩個函數分別生成這兩個矩陣。
【例1-14】零矩陣和全1矩陣示例。
>> A=rand(5) A= 0.4103 0.0099 0.2722 0.9318 0.2026 0.8936 0.1389 0.1988 0.4660 0.6721 0.0579 0.2028 0.0153 0.4186 0.8381 0.3529 0.1987 0.7468 0.8462 0.0196 0.8132 0.6038 0.4451 0.5252 0.6813 >> B=zeros(size(A)) B= 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >> C=ones(4,4) C= 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
(2)單位矩陣
單位矩陣是特殊矩陣中用得最多的矩陣之一,一般用I來表示單位矩陣,MATLAB提供的函數為eye。
【例1-15】求單位矩陣。
>> I=eye(4) I= 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 >> I=eye(size(B)) I= 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
(3)其他特殊矩陣(如表1-8所示)
表1-8 特殊矩陣列表

(4)特殊矩陣應用示例
1)隨機矩陣和零矩陣應用示例
【例1-16】Monte Carlo評估方法。
在M文件編輯器中輸入以下命令:
close all; rand('seed',.123456) NumberInside=0; PiEstimate=zeros(499,1); for k=1:499 a=-1+2*rand(99,1); b=-1+2*rand(99,1); NumberInside=NumberInside+sum(a.^2+b.^2<=1); PiEstimate(k)=(NumberInside/(k*99))*4; end plot(PiEstimate) title(sprintf('Monte Carlo Estimate of Pi=%5.3f',PiEstimate(499))); xlabel('Hundreds of Trials')
運行程序效果如圖1-13所示。

圖1-13 Monte Carlo評估結果
2)魔方矩陣函數magic產生的三維圖形應用示例
【例1-17】在M文件編輯器中輸入以下命令。
for n=9:12 subplot(2,2,n-8); surf(magic(n)); title('num2str(n)') axis off; view(30,45); axis tight end
運行程序效果如圖1-14所示。

圖1-14 運用magic函數產生的三維圖形
3.稀疏矩陣及其示例
稀疏矩陣是一種特殊的矩陣形式,在計算機系統中,內存空間只分配給非零元素。為了能有效地提高計算機的存儲效率,節省計算時間和存儲空間,產生了稀疏矩陣的理論和方法。MATLAB中有4個最基本的稀疏矩陣,它們分別是單位矩陣、隨機矩陣、對稱隨機矩陣和對稱矩陣。在MATLAB中,提供了一系列的特殊函數來進行稀疏矩陣的運算,如表1-9所示。
表1-9 常用的稀疏矩陣函數

【例1-18】生成一個0-1分布的隨機稀疏矩陣。
>> a=[1 6 8 4 9 5 7 2]; >> x=diag(a) x= 1 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 2 >> y=sprand(x) y= (1,1) 0.8214 (2,2) 0.4447 (3,3) 0.6154 (4,4) 0.7919 (5,5) 0.9218 (6,6) 0.7382 (7,7) 0.1763 (8,8) 0.4057 >> spy(y,'d')
最后用函數spy查看非零元素的分布情況,如圖1-15所示。

圖1-15 稀疏矩陣分布圖
【例1-19】稀疏矩陣的存儲。
因為稀疏矩陣是按列存儲的,而系統訪問矩陣的時候一般是按照行讀取效率更高。試比較添加矩陣的行和列所用的時間。
>> s=sparse(9999,9999,1); >> tic; %開始計時 >> for n=1:999 A=s(99,:)+s(199,:); end; >> toc Elapsed time is 29.807829 seconds. >> s=sparse(9999,9999,1); >> tic; >> for n=1:999 B=s(:,99)+s(:,199); end; >> toc Elapsed time is 35.531123 seconds. >> s=sparse(9999,9999,1); >> tic; >> for n=1:999 A=s(99,:)'+s(199,:)'; A=A'; end >> toc Elapsed time is 39.239814 seconds.
從例1-19中可以很明顯地看出,在編程中若是能夠有效利用稀疏矩陣的存儲特點將會大大提高運算效率。
- Advanced Splunk
- Java程序設計(慕課版)
- 自然語言處理實戰:預訓練模型應用及其產品化
- LabVIEW Graphical Programming Cookbook
- Leap Motion Development Essentials
- Neo4j Essentials
- 基于免疫進化的算法及應用研究
- 機械工程師Python編程:入門、實戰與進階
- Windows Forensics Cookbook
- HTML5入門經典
- 微信小程序項目開發實戰
- 數據結構習題解析與實驗指導
- Multithreading in C# 5.0 Cookbook
- Azure Serverless Computing Cookbook
- 網絡數據采集技術:Java網絡爬蟲實戰