• 沒有找到結果。

MATLAB 簡介與基本操作

N/A
N/A
Protected

Academic year: 2021

Share "MATLAB 簡介與基本操作"

Copied!
69
0
0

加載中.... (立即查看全文)

全文

(1)

MATLAB 簡介與基本操作

(參考資料:MATLAB基礎學習與應用 陳奇中著)

基本數學運算

向量與矩陣之處理

數據處理與列印輸出

(2)

MATLAB 是什麼?

MATLAB為美國Mathworks公司於1984年所推出的 數學運算軟體。

其名稱是由「矩陣實驗室」(MATrix LABoratory)所 合成。

特長於矩陣相關運算及各領域數值問題。

提供科學計算、數值分析、圖形繪製、系統模擬、

訊號處理等功能

為各種動態系統模擬、數位訊號處理、科學計算、

科學目視等領域的標準程式語言。

(3)

MATLAB 小傳

MATLAB早在 1978 年即已現身,是用 Fortran 撰寫 的免費軟體,其作者是當時任教於新墨西哥大學 的 Cleve Moler 教授。

Jack Little(又稱為 John Little)將 MATLAB 以C語 言重寫,並於 1984 年成立 MathWorks公司,首次 推出 MATLAB 商用版。(DOS 版)

1993年進入Windows作業系統,推出Simulink互動 式動態模擬環境以及符號數學運算功能。

之後不斷改版、改版、再改版,目前最新版本為 R2021a,其網站為http://www.mathworks.com

(4)

為什麼要用 MATLAB ?

MATLAB是個直譯式高階語言,和其他常見的

C/C++、JAVA及VB等高階語言比較起來,MATLAB 在程式撰寫及資訊視覺化視窗這兩方面相當方便,

初學者可說是一學就會、入門輕鬆。

MATLAB省略許多複雜的語法,採取接近人類思維 的語法,同時提供許多指令處理複雜運算。

MATLAB目前已被廣泛應用於數學、工程、物理、

化學、醫學、金融、生物資訊等領域有關數值計 算問題。

許多國內外大學教科書將納為問題求解模擬示範 的工具軟體。

(5)

使用 MATLAB 的好處

MATLAB是一種可以提供便利的環境用以進行各 種數學運算的電腦程式

直譯式的數學程式語言,不需編譯(compile)或連 結(link)即可直接執行

將所有變數均存成double的形式,所以不需經過 變數宣告,亦不需要陣列宣告

包含了非常豐富的內建函數,同時亦提供完整的 線上輔助說明

(6)

MATLAB 特色

在矩陣及線性代數上,提供各種先進的演算法則 來做數值運算。

簡單好學,語法簡單。

程式重複使用方便且快速。

提供非常完備的數學函數,且能讓使用者定義自 己的函數。

二、三維的繪圖功能強大,完整的資料視覺化顯 示功能,幫助使用者分析資料。

提供超過80種以上的工具箱(ToolBox),可以幫助 使用者處理相關領域問題。

(7)

如何進入 MATLAB?

step 1 進入Windows

step 2 載入Matlab

(8)

MATLAB 環境

MATLAB有三個主要視窗:

命令視窗。用來輸入指令和資料。

圖形視窗。用來顯示繪圖與圖形。

編輯視窗。用來建立與編輯M檔。

根據計算機平台和MATLAB的版本,這些視窗

可能有不同的外觀和感覺。

(9)

計算機模式

MATLAB的命令模式是循序的,正如同一行一行地 輸入指令。對於每一個指令,立刻得到一個結果。

因此,你可以想像成正在操作一台很奇幻的計算 機一樣。

例如,你可以輸入

>> 55  16 ans =

39

(10)

如何做簡單數學運算?

在MATLAB 命令視窗(Command Window)

內的提示符號(>>)之後輸入運算式,並按入 Enter 鍵即可。例如:

>> (5*2+3.5)/5 ans =

2.7000

若不想讓 MATLAB 每次都顯示運算結果,只需 在運算式最後加上分號(;)即可,例如

>> (5*2+3.5)/5;

(11)

MATLAB 變數

若沒有指定變數名稱,MATLAB會自動地將答案指 派給一個變數,稱為ans。因此,你可以使用ans 來進行下一步的計算。

指派的意思是將值分配到各個變數名稱,亦即將 計算結果儲存到對應於變數名稱的記憶體當中。

Ex 1: 五隻雞和二隻兔,共幾隻腳?

>>chicken=5;

>>rabbit=2;

>>legs=chicken*2+rabbit*4 執行結果

legs = 18

(12)

Ex 2: 求

>>exp(-3)*cos(3)/asin(0.5) ans =

-0.0941

Ex 3: 23=?

>>2^3 ans =

8

NOTE: 運算次序 ^ × / + -

) 5 . 0 ( sin

/ ) 3

cos(

1

3

e

(13)

Ex 4: 壓力單位換算 3 bar = ? psi

( 1 bar = 100000 pa = 14.50377 psi = 750 mm Hg )

>> 3*14.50377 ans =

43.51131

Ex 5: 熱量單位換算 4 KJ(千焦) = ? Kcal (千卡)

(1 KJ = 102 kg-m = 0.2389 kcal = 0.9478 Btu)

>>4*0.2389 ans =

0.9556

(14)

變數名稱限制

變數名稱小於等於19字元

第一字元不能為數字

字元大小寫表示不同意義

Ex1: c123 (o)

4c123(X)

c_123(o)

c-123(X)

註:MATLAB 在使用變數時,不需預先經過變數宣告

(Variable Declaration)的程序,而且所有數值變數均以 預設的 double 資料型式儲存。

(15)

特殊符號

% 註解

; 不顯示執行結果

 連續

(16)

格式命令

>> format short; pi ans =

3.1416

>> format long; pi ans =

3.14159265358979

>> format short eng; pi ans =

3.1416e+000

>> pi*10000 ans =

31.4159e+003

(17)

Getting workspace information

who %顯示變數名稱

whos %顯示變數名稱及其大小格式

dir %顯示所有檔案

what %顯示檔案*.m或*.mat

clc %清除螢幕

clear %清除變數

>>clear all

%清除所有變數

>>clear a b

%清除變數 a and b

(18)

常見數學函數

1. abs(x) % 取絕對值 2. acos(x) %

3. acosh(x) %

4. angle(x) % 複數的角度 5. asin(x) %

6. atan(x) % 7. atanh(x) %

cos ( )1

x

cosh ( )1 x

sin ( )1

x

tan ( )1 x

tanh ( )1 x

(19)

常見數學函數

8. ceil(x) % 取最接近且大於原數的整數 (無條件進入)

9. floor(x) % 取最接近且小於原數的整數 10. round(x) % 四捨五入(取至整數為止)

11. fix(x) % 無條件捨去 12. conj(x) % 共軛複數

13. cosh(x) % cosine hyperbolic function 14. exp(x) % exponential :

15. real(x) % 取實部 imag(x) 取虛部

e

x

(20)

常見數學函數

16. log(x) % 17. log10(x) %

18. rem(x,y) % x/y的餘數 19. sign(x) % 取正負號 20. sin(x)

21. sinh(x)

22. sqrt(x) % 23. tan(x)

24. tanh(x)

loge x = ln x log10

x

x

(21)

Ex1: 求解

>>分析

>> a=1; b=2; c=3;

>>x1=(-b+sqrt(b^2-4*a*c))/(2*a)

x1 =

-1.0000 + 1.4142i

>>x2=(-b-sqrt(b^2-4*a*c))/(2*a)

x2 =

-1.0000 - 1.4142i

ax

2

 bx  = c 0

x x b b ac

1 2

a

2 4

, =   2 

(22)

有關複數之種種

(1) 內定符號 i及 j

>>x=1+cos(2)*i x =

1.0000 - 0.4161i

NOTE: 若 i 之前是數字則直接接 i,若不是數字則要用*號

(2) 複數大小及角度 abs(x) , angle(x) (3) 實部及虛部 real(x) , imag(x) (4) 複數之共軛複數 conj(x)

(23)

有何線上支援?

help:用來查詢已知指令的用法。

lookfor:用來尋找未知的指令。找到所需的指令 後,即可用 help 進一步找出其用法。

helpwin 或 helpdesk:產生線上支援視窗,其效 果和直接點選 MATLAB 命令視窗工作列的圖示是 一樣的。

doc:產生特定函數的線上支援。

(24)

陣列、向量和矩陣

所謂陣列 (array) ,就是將一堆數值集合起來 用一個單一的變數名稱表示。一維的陣列稱為 向量 (vector),二維的陣列則稱為矩陣

(matrix)。

在命令模式下,中括號用來輸入陣列。

(25)

向量如何處理?

(1) 向量格式 Ex1:

>>x=[1 2 3]

x =

1 2 3

>>x=[pi/2 sqrt(2) 2]

x =

1.5708 1.4142 2.0000

>> b = [2;4;6;8;10]

b =

2 4 6 8 10

用逗號或空白鍵區隔各元素

用分號換列

(26)

冒號運算子

1

如果冒號用來分開兩個數字,MATLAB會自動 產生這兩個數字之間増量 (increment) 為1的所 有數字。

如果冒號用來隔開三個數字,則MATLAB會產

生一個向量,此向量的元素介於第一個數字與

第三個數字之間,第一個數字為此向量之第一

個元素,其他元素則以第二個數字當作增量。

(27)

(2) 向量之給法

1. x=[1 2 3]

%1×3向量

2. x=1:1:3 or x=1:3

%增量為1 x=起始值:增量:終值

Ex1: 0~π取十點

>>x=0:pi/9:pi

x =

Columns 1 through 7

0 0.3491 0.6981 1.0472 1.3963 1.7453 2.0944 Columns 8 through 10

2.4435 2.7925 3.1416

(28)

linspace 與 logspace 函數

linspace函數可以產生固定間隔數值的列向量。

以下列形式:

linspace(x1, x2, n) 在x1和x2之間建立n個點。

logspace函數建立起以對數間隔的列向量。依 下列形式:

logspace(x1, x2, n)

其中n代表在10x1和10x2之間等對數間隔地建立出 n個點。

(29)

Ex2: 0~π取十點

>>x=linspace(0,pi,10)

x =

Columns 1 through 7

0 0.3491 0.6981 1.0472 1.3963 1.7453 2.0944 Columns 8 through 10

2.4435 2.7925 3.1416

NOTE: x=linspace(起始值, 終值, 點數)





=

9 8 9

7 9

6 9

5 9

4 9

3 9

2 0 9

x

i.e.,

(30)

Ex3: 100~102 取11點

>>x=logspace(0,2,11)

x =

Columns 1 through 7

1.0000 1.5849 2.5119 3.9811 6.3096 10.0000 15.8489 Columns 8 through 11

25.1189 39.8107 63.0957 100.0000

i.e., x=[ ]

100 100.2 100.4 100.6 100.8 101.0 102

(31)

(3) 如何取出向量各位置之值

>>x=[1 2 sqrt(2)];

>>x(3)

ans =

1.4142

(4) 向量運算

>>x=[1 2 3];

>> y=cos(x) % note: y=向量

y =

0.5403 -0.4161 -0.9900

• MATLAB內建函數有一個重 要特性,就是它們也可以 同樣用來對向量或矩陣進 行運算。

(32)

Ex: 理想氣體已知溫度t及壓力p莫耳數n求體積。當 實驗數據溫度、壓力。數具有很多組時,可以向 量處理。

>> t=[100 200 300 400 500]; % temperature in K

>> p=[2 3 4 5 6]; % atm

>> n=1; % mole

>> r=8.314; % joule/K mol

>> v=n*r*t./p

v =

415.7000 554.2667 623.5500 665.1200 692.8333

NOTE: 除號/ 之前的點. 表示向量內各數值分別做除的計算

如何將陣列A中的每一個元素取平方?你可以利用:

>> A .^ 2

(33)

(5) roots 解多項式(向量的應用)

Usage: roots([ ])

Ex:

>>roots([2 3 0 1 0 1]) ans =

-1.7246

-0.3632 + 0.6597i -0.3632 - 0.6597i

0.4755 + 0.5339i 0.4755 - 0.5339i

a xn n  a xn1 n1  a x1 1  a0 = 0

an an1 an2 a1 a0

2x5 3x 4 x2  =1 0

(34)

(6) 向量合併

>>x=[1 2 3 3 2 1];

>>y=[4 5];

>>a=[x y]

a =

1 2 3 3 2 1 4 5

>>b=[a(1:2:5) 1 0 1]

b =

1 3 2 1 0 1

(35)

向量之運算

(1) 向量之加減法

Ex:

>>x=[1 2 3]

>>a=x+1 %向量與純量之加法 a =

2 3 4

>>1-x ans =

0 -1 -2

(36)

>>x=[1 2 3];

>>y=[4 5 6];

>>x+y %向量與向量之加法

ans =

5 7 9

>>z=[-1 -2];

>>x+z

??? Error using ==> +

Matrix dimensions must agree.

NOTE: x+z %向量大小不一致,無法計算

(37)

(2) 向量的乘法

>>x=[1 2 3];

>>pi*x %純量乘向量 ans =

3.1416 6.2832 9.4248

>>x=[1 2 3];

>>y=[4 5 6];

>>x.*y %向量乘向量 ans =

4 10 18

(38)

(3) 向量的除法

與乘法相同,其中x./y表 ,x.\y表示

>>x=[1 2 3];

>>y=[4 5 6];

>>x./y %向量除向量 ans =

0.2500 0.4000 0.5000

x y

y x

(39)

向量的轉置

Ex:

>>x=[1 2 3]; %列向量

>>y=x' %行向量

y =

1

2

3

(40)

Ex: (1 2 3) 與(4 5 6) 內積=?

>>x=[1 2 3];

>>y=[4 5 6];

>>x*y' % 內積

ans = 32

>>x.*y %向量 ans =

4 10 18

(41)

Ex:

>>x=[1+i 2 3-i];

>>x' %共軛轉置 ans =

1.0000 - 1.0000i 2.0000

3.0000 + 1.0000i

>>x.' %轉置但不取共軛 ans =

1.0000 + 1.0000i 2.0000

3.0000 - 1.0000i

(42)

矩陣如何處理

(1) 如何輸入一個矩陣

Ex:

法一.

>>A=[ 1 2 3 4 5 6 7 8 9] ;

法二.

>>A=[1 2 3 ; 4 5 6 ; 7 8 9];

1 2 3 4 5 6 7 8 9

 

 

(43)

(2) 矩陣的擴增

>>A=[1 2 3 ; 4 5 6 ; 7 8 9]

>>R=[10 11 12]

A =

1 2 3 4 5 6 7 8 9 R =

10 11 12

(44)

>>B=[A;R]

>>R=[10 11 12]

B =

1 2 3 4 5 6 7 8 9 10 11 12

>>C=[A;R']

??? All rows in the bracketed expression must have the same number of columns.

(45)

(3) 矩陣的索引或下標

矩陣 A 中,位於第 i 橫列、第 j 直行的元 素可表示為 A(i, j)

i 與 j 即是此元素的下標(Subscript)或索引

(Index)

MATLAB 中,所有矩陣的內部表示法都是

以直行為主的一維向量

A(i, j) 和 A(i+(j-1)*m) 是完全一樣的~m為矩陣A的 列數

我們可以使用一維或二維下標來存取矩陣

(46)

(3) 矩陣的索引或下標

(47)

Ex:

>>a=[1 2 ;3 4];

>>a(3,3)=1; % a在(3,3)位置值是1

>>a

a =

1 2 0 3 4 0 0 0 1

(48)

冒號運算子

2

除了創造一系列的數字外,冒號還可以當作通 配符 (wildcard) 使用,用來選取矩陣個別的列 或行。

我們也可以利用冒號來選取陣列中一系列的元

素。

(49)

(3) 如何從矩陣中取值或舉出一個子矩陣

>>A=[1 2 3;4 5 6;7 8 9]

>>X=A(3,2) %X=A(row , column)

>>B=A(1:2,1:2)

>>C=A( : ,1:2) %C=A(全取 , 第一行至第二行)

>>D=A(2:3, : )

>>E=A(1:2,[1 3]) A =

1 2 3 4 5 6 7 8 9

(50)

X = 8 B =

1 2 4 5 C =

1 2 4 5 7 8

D =

4 5 6 7 8 9 E =

1 3 4 6

(51)

(4) 一些相關指令

flipud(a) %上下顛倒 fliplr(a) %左右顛倒

rot90(a) %旋轉90度(逆時針) reshape(a,m,n) %重定矩陣行列數

diag(v) %取對角線元素所形成之向量

(52)

(5) 矩陣轉置

B' 複數轉置為共軛轉置 , B.' 單純轉置 1 2

A 3 4

 

=  

 

1 3 A ' 2 4

 

=  

 

1 1

B 1 3

i

i i

  

=   

1 1

B' 1 3

i

i i

  

=      

1 1

B.' 3

i

i i i

  

=   

(53)

NOTE:取出矩陣大小維度 [r,c]=size(A)

r=列數 c=行數 n=length(v)

顯示向量之長度或矩陣之行數 NOTE:將矩陣變為向量

>>A=[1 2 ; 3 4];

>>B=A(:) B =

1 3 2 4

(54)

NOTE: 將矩陣的某行、某列消除

Ex:

>>A=[1 2; 3 4; 5 6];

>>A(2,:)=[ ] A =

1 2 5 6

將第二列全部空白(即取消)

1 2 A 3 4 5 6

= 

1 2 A 5 6

= 

(55)

矩陣運算相關指令

1. det(A) %行列式值 2. inv(A) %反矩陣 3. eig(A) %特徵值 4. rank(A) %秩、階數

5. cond(A) %2-norm條件數 6. poly(A) %特徵多項式

7. polyvalm(v,A) %矩陣多項式求值 8. expm(A) %

9. [r,c]=size(A) 10. n=length(v)

eA

(56)

一些特殊矩陣

1. eye(n,m) %單位矩陣nxm 2. eye(n) %單位矩陣nxn

3. ones(n,m) %常數矩陣nxm全部為1 4. ones(n) %常數矩陣nxn全部為1 5. zeros(n,m) %常數矩陣nxm全部為0 6. zeros(n) %常數矩陣nxn全部為0 7. rand(n,m) %亂數所形成nxm的矩陣 8. randn(n) %亂數所形成nxn的矩陣

(57)

找最大值

>>[m, index]=max(data)

data為向量: m為向量元素中之最大值, index為 最大 值發生處(索引值)

data為矩陣: m為每個column之最大值, index為最大 值發生處(列索引值)

m=15 9 23 index=2 2 4

data =

12 8 18 15 9 22 13 5 19 14 7 23 10 3 20

(58)

找最小值

>>[n, index]=min(data) n=10 3 18

index=5 5 1

(59)

求平均值 和 SUM

>>avg=mean(data) avg= 12.8 6.4 20.4

>>s=sum(data)

s= 64 32 102

(60)

NOTE:數據分析相關指令

corrcoef(x) cov(x)

cumprod(x) diff(x)

hist(x)

median(x)

prod(x) %連乘

sort(x) %排序 std(x) %標準差

(61)

如何做文字、字串處理

t=‘national taipei university';

u=t(17:26)

v=t(26:-1:17) u =

university v =

ytisrevinu

(62)

建立與存取檔案

1

MATLAB能讀寫資料檔,最簡單的方法是一個 稱為mat檔的二進位檔案,它能以save和

load的指令在MATLAB中執行建立與存取檔

案。

(63)

建立與存取檔案

2

save指令被用來在工作或選擇的變數中產生MAT檔。

其語法為:

save filename var1 var2 … varn

此指令建立一個包含var1到varn變數且名為

filename.mat的MAT檔案,假如變數被省略,所有 的工作變數都會被儲存。

load指令被用來擷取檔案載入變數:

load filename var1 var2 … varn

此指令被用來由filename.mat的MAT檔案中擷取 var1到varn的變數,和save指令一樣,假如變數被 省略,所有的工作變數都會被儲存。

(64)

如何儲存變數?

使用 save 保存變數

save:將所有變數以二進位格式存至『matlab.mat』中 save fname:將所有變數存至『fname.mat』中

save fname X Y:將變數 X 與 Y 存至『fname.mat』中 save fname X -ascii:使用 8 位數文字格式將變數 X 存至

『fname』中

save fname X -ascii -double:使用 16 位數文字格式將變 數 X 存至『fname』中

註:ASCII 格式的文字檔能以附加指令 –ascii在指令save的 MATLAB 環境產生。

>> A = [5 7 9 2;3 6 3 9]

>> save simpmatrix.txt –ascii

(65)

如何載入數據檔?

使用 load 載入變數:

load:由『matlab.mat』中載入所有變數

load fname:由『fname.mat』中載入所有變數

load fname X Y:由『fname.mat』中載入變數 X 與 Y load fname -ascii:由文字檔『fname』中載入變數 load fname.ext:由文字檔『fname.ext』中載入變數

變數命名方式:

binary (.mat):恢復變數原始名稱

ASCII:變數以檔名來命名,檔名中所有數字換成底線;若檔 名開頭第一個字元為數字或底線,則在之前加上一個‘X’

(66)

輸入

input函數可以讓你從命令視窗中向使用者要求 一個值。語法如下:

n = input(promptstring)

此函數顯示出promptstring,並且等待從鍵盤 的輸入,並且從鍵盤傳回這個值。

若要輸入一個字串

n = input(promptstring, s)

(67)

輸出

disp函數提供一個可方便顯示值的方法。語 法如下:

disp(value)

其中value = 想要顯示的值。

它可以是一個常數或一個變數,

disp(x)

甚至是一個字串。

disp(x)

(68)

格式化輸出

fprintf函數提供顯示訊息的額外控制功能。關 於此語法的簡單例子如下:

fprintf(format, x, …)

其中format是一個字串,用以指定希望如何顯示 變數x的值。

範例:

fprintf(Values of a and b are %.3f and %d\n, a, b)

(69)

格式控制符號

參考文獻

相關文件

• Performance: vectorized code often runs much faster than the corresponding code containing loops.. Zheng-Liang

Appearance: Vectorized mathematical code appears more like the mathematical expressions found in textbooks, making the code easier to understand.. Less error prone: Without

All variables defined as the result of entering statements in the command window, exist in the Matlab workspace. At the beginning of a Matlab session, the workspace

此行文字的特別意義,是讓 MATLAB 藉由 lookfor 指令 搜尋並顯示此函式用途。.. 語法:

print –dtiff my_image.tif: 將目前指定的圖形,產生 TIFF 格式的影像檔,並以my_image.tif 的檔名儲存。.

 MATLAB 程式使用 pass-by-value 的方 式,進行程式與函式間的溝通聯絡,當 程式呼叫函式時, MATLAB

In this study, we compute the band structures for three types of photonic structures. The first one is a modified simple cubic lattice consisting of dielectric spheres on the

Jack Little(又稱為 John Little)將 MATLAB 以 C 語言重 寫,並於 1984 年成立 MathWorks 公司,首次推出 MATLAB 商用版。.. MathWorks 在