matlab 程式設計:進階篇 線性代數

33
MATLAB 程程程程 程程程 程程程程 程程程 (Roger Jang) [email protected] http://mirlab.org/jang 程程程程程 程程 程程程程程

Upload: garan

Post on 05-Jan-2016

149 views

Category:

Documents


0 download

DESCRIPTION

MATLAB 程式設計:進階篇 線性代數. 張智星 (Roger Jang) [email protected] http://mirlab.org/jang 台大資工系 多媒體檢索實驗室. 反矩陣. 反矩陣 : 一個矩陣 A 的反矩陣可表示成 ,滿足下列恆等式: 只有在 A 為方陣時, 才存在。 若 不存在,則 A 稱為 Singular. 反矩陣 (2). inv : MATLAB 的 inv 指令可用於計算反矩陣 範例 6-1 : inv01.m - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計:進階篇線性代數

張智星 (Roger Jang)[email protected]

http://mirlab.org/jang台大資工系 多媒體檢索實驗室

Page 2: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

反矩陣 反矩陣:

一個矩陣 A 的反矩陣可表示成 ,滿足下列恆等式:

只有在 A 為方陣時, 才存在。 若 不存在,則 A 稱為 Singular

IAA

IAA

1

1

1A

1A

1A

Quiz!

Page 3: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

反矩陣 (2) inv :

MATLAB 的 inv 指令可用於計算反矩陣 範例 6-1: inv01.m

結果: B = 4.0000 -6.0000 4.0000 -1.0000

-6.0000 14.0000 -11.0000 3.0000 4.0000 -11.0000 10.0000 -3.0000 -1.0000 3.0000 -3.0000 1.0000

Note that det(pascal(n)) is always equal to 1.

A = pascal(4); % 產生 4x4 的 Pascal 方陣

B = inv(A)

Page 4: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

反矩陣 (3) inv :

若矩陣 A 為 Singular (即其反矩陣不存在),則在使用 inv 指令時,會產生警告訊息

範例 6-2 : inv02.m

結果:

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

B = inv(A)

Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 1.541976e-018. > In inv02 at 2 B = 1.0e+016 * -0.4504 0.9007 -0.4504 0.9007 -1.8014 0.9007 -0.4504 0.9007 -0.4504

Page 5: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

行列式 det :

欲計算矩陣 A 的行列式,可用 det 指令 範例 6-3 : det01.m

結果:d = 29

A = [1 3 4; -3 -4 -1; 2 2 5];

d = det(A)

Page 6: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

反矩陣公式 由 Crammer Rule 可知矩陣 A 的行列式和反矩陣有下列關係式:

其中 代表 A 的行列式, 代表 A 的 Adjoint Matrix

Equivalent statements is singular does not exist

IAAadjAA

AadjA *)(*

)(1

A )(Aadj

A1A

0A

Quiz!

Quiz!

Page 7: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

Cofactor and Adjoint Take a 3x3 matrix A for example:

IAAadjA

AcofactorAadj

aa

aa

aa

aa

aa

aaaa

aa

aa

aa

aa

aaaa

aa

aa

aa

aa

aa

AAA

AAA

AAA

Acofactor

aaa

aaa

aaa

A

T

*)(*

)(

)(

2221

1211

2321

1311

2322

1312

3231

1211

3331

1311

3332

1312

3231

2221

3331

2321

3332

2322

333231

232221

131211

333231

232221

131211

...131312121111 AaAaAaA

Quiz!

Page 8: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數How to Verify the Formula?

IA

A

A

A

AaAaAaAaAaAaAaAaAa

AaAaAaAaAaAaAaAaAa

AaAaAaAaAaAaAaAaAa

AAA

AAA

AAA

aaa

aaa

aaa

AadjA

IAAadjA

*

00

00

00

)(*

?*)(* verify toHow

333332323131233322322131133312321131

332332223121232322222121132312221121

331332123111231322122111131312121111

332313

322212

312111

333231

232221

131211

333332323131

232322222121

131312121111

: thatNote

AaAaAa

AaAaAa

AaAaAaA

Quiz!

Page 9: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

Quiz Candidates If A is a 3x3 matrix, what is

cofactor(A)? What is adj(A)?

And can you verify that

?

333231

232221

131211

Aadj

aaa

aaa

aaa

A

IAAAadj **

Quiz!

Page 10: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

反矩陣與行列式之驗證 (1/2) 若 A 為整數矩陣,則 乘上 必為整數矩陣,可驗証如下:

範例 6-4: det02.m

結果:

A 1A

A = [1 3 4; -3 -4 -1; 2 2 5];

det(A)*inv(A)

ans = -18 -7 13 13 -3 -11 2 4 5

Page 11: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

反矩陣與行列式之驗證 (2/2) 若 A 為整數矩陣,將 inv(A) 以有理形式( Ration

al Format ,即分子和分母都是整數的分數)來表示,即可察覺出它和行列式的關係

從這裡可以很明顯的看出, inv(A) 中每個元素的分母值,就是 det(A)

範例 6-5: det03.m

結果:

A = [1 3 4; -3 -4 -1; 2 2 5];

format rat % 以有理形式表示數值

inv(A)

format short % 改回預設的數值表示形式ans =

-18/ 29 -7/ 29 13/ 29

13/ 29 -3/ 29 -11/ 29

2/ 29 4/ 29 5/ 29

Page 12: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

固有值與固有向量 一個方陣 A 的固有向量( Eigenvector ) 與固有值 ( Eigenvalue ) 的關係式如下:

上式可化簡成

由於 x 不是一個零向量,因此 必須是 Singular ,上式才會有解。當 是 Singular 時,其行列式為零:

x

xAx

0) xIA

0 IA

IA IA

Quiz!

Page 13: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

固有值分解 (1/2) 若 A 為 n×n 的矩陣,則上式為 的 n 次多項式 ,代表 將有 n 個解 ,滿足下列關係式:

或可寫成矩陣形式:

其中

如果 存在,則由上式可得矩陣 A 的固有值分解( Eigenvalue decomposition ):

nnn xAx

xAx

111

XDAX

||

||

1

nxxX

n

D

00

00

001

1XDXA

1X

n 1

Quiz!

Page 14: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

固有值分解 (2/2) If A is symmetric, then Suppose A is 3x3, then

TTT

T

T

T

T

T

T

T

xxxxxx

x

x

x

xxx

x

x

x

xxx

XDXXDXA

333222111

33

22

11

321

3

2

1

3

2

1

321

1

|||

|||

00

00

00

|||

|||

TXX 1

Quiz!

Page 15: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

計算固有值 eig :

MATLAB 的 eig 指令可用於計算矩陣的固有值及固有向量。若只想計算固有值時,可輸入如下:

範例 6-6: eig01.m

結果:

A = magic(5);

lambda = eig(A)

lambda =

65.0000

-21.2768

-13.1263

21.2768

13.1263

Page 16: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

計算固有值與固有向量 若要同時計算固有值及固有向量,須提供兩個輸出引數 範例 6-7: eig02.m

結果:

A = magic(5);

[X, D] = eig(A)

X = -0.4472 0.0976 -0.6330 0.6780 -0.2619 -0.4472 0.3525 0.5895 0.3223 -0.1732 -0.4472 0.5501 -0.3915 -0.5501 0.3915 -0.4472 -0.3223 0.1732 -0.3525 -0.5895 -0.4472 -0.6780 0.2619 -0.0976 0.6330 D = 65.0000 0 0 0 0 0 -21.2768 0 0 0 0 0 -13.1263 0 0 0 0 0 21.2768 0 0 0 0 0 13.1263

請驗證看看

X*D*inv(X)是否等於A 。

Page 17: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

固有向量和固有值的展示 Try “eigshow” to plot the trajectory of

a linear transform in 2D

Page 18: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

奇異值與奇異向量 一個矩陣 A 與其奇異值( Singular Value ) 及奇異向量( Singular Vectors ) u 與 v 之間存在下列的關係式:

若將所有的行向量 u 並排成矩陣 U ,所有的行向量 v 並排成矩陣 V 。則上式可寫成:

其中 Σ 的主對角線即是對應的 值,其餘元素為零

vuA

uAvt

VUA

UAVT

Page 19: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

奇異值分解 若 A 的維度是 m×n ,則 U、 Σ、 V 的維度分別是

m×m、m×n 以及 n×n 。一般而言, U 和 V 均是 Unitary 矩陣(即矩陣內的行向量均兩兩相互垂直,且行向量的長度均為 1 ),滿足下列條件:

因此矩陣 A 可寫成:

上式稱為奇異值分解( Singular Value Decomposition )

IVV

IUUT

T

TVUA

Page 20: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

計算奇異值與奇異向量 svd :

svd 指令可用於計算矩陣的奇異值及奇異向量 範例 6-8: svd01.m

結果:U =

-0.5577 0.0881 -0.6954 0.4447

-0.7714 0.0333 0.2489 -0.5848

-0.1771 0.6471 0.5453 0.5025

-0.2504 -0.7565 0.3965 0.4558

A = [3 5; 4 7; 2 1; 0 3];

[U, S, V] = svd(A)

S =

10.4517 0

0 1.9397

0 0

0 0

V =

-0.4892 0.8722

-0.8722 -0.4892

請驗證看看

U*S*V’是否等於 A 。

Page 21: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

計算 奇異值與奇異向量 (2) 若 A 為 m×n 的矩陣且 m >> n ,則我們可在原先的 svd 指令加入另一個輸入引數 0 ,使其產生的 U 及 S 矩陣具有較小的維度

範例 6-9: svd02.m

結果 :

U = -0.5577 0.0881 -0.7714 0.0333 -0.1771 0.6471 -0.2504 -0.7565

A = [3 5; 4 7; 2 1; 0 3];

[U, S, V] = svd(A, 0)

S = 10.4517 0 0 1.9397 V = -0.4892 0.8722 -0.8722 -0.4892

請驗證看看

U*S*V’是否等於 A 。

Page 22: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

線性聯立方程式 聯立線性方程式:

線性代數中最重要的問題,即是解決聯立線性方程式。一組線性方程式可用矩陣表示如下:

AX = B 其中 A 、 B 是已知矩陣,而 X 則是未知矩陣

Page 23: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

線性聯立方程式之可能情況 線性聯立方程式:

為簡化起見,我們可以假設 A 、 X 、 B 的維度分別是 m×n 、 n×1 、 m×1 ,其中 m 代表方程式的數目,n 則是未知數的數目,可分成三種情況:

若 m = n ,則方程式的個數和未知數的個數相等,通常會有一組解滿足 AX = B

若 m > n ,則方程式的個數大於未知數的個數,通常無一解可滿足 AX = B ,但我們可轉而求取最小平方解( Least-Squares Solution) X ,使得 為最小值

若 m < n ,則方程式的個數小於未知數的個數,通常有無限多組解可滿足 AX = B ,我們可尋求一基本解( Basic Solution) X ,使得 X 最少包含 m-n 個零元素

2BAX

Page 24: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

斜線和反斜線運算 斜線和反斜線運算:

MATLAB 提供一個反斜線運算( Back Slash Operator ,即「 \ 」)使得 X=A\B 能滿足上述三種情況

反斜線運算又稱「左除」( Left Division ) MATLAB 也提供了斜線運算( Slash Operator ,即「 / 」)

斜線運算又稱「右除」( Right Division ) 可用於對付 XA = B 的方程組。

Page 25: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

斜線和反斜線運算:記憶法 整理: MATLAB 常用的數學函數

在上表中,欲解 AX = B 或 XA = B ,我們可以想像在等號兩邊各除以 A ,並依 A 的位置分別取用「左除」或「右除」

方程式形式 MATLAB 解法

AX = B X = A\B(左除)

XA = B X = B/A(右除)

Page 26: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

範例:通過三點的二次曲線 斜線和反斜線運算:

範例 6-10: leftDiv01.m

結果: X = 1.0000 2.0000 3.0000

此例代表通過 (1, 6), (2, 11), (3, 18) 的二次曲線為

A = vander(1:3);

B = [6; 11; 18];

X = A\B

>> A*X – BAns = 0 0 0

322 xxy

Page 27: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

範例:最小平方解 斜線和反斜線運算:

當 m > n 時,「左除」可以找到最小平方解 範例 6-11: leftDiv02.m

結果: X = 1.0000 1.0000

在上例中,我們有 3 個方程式,但卻只有 2 個未知數,此 3 個方程式在 x-y 平面並未交於一點,故嚴格地說,此方程組無解,而 MATLAB 「左除」找到的 X 為最小平方解,使得 為最小

A = [2 -1; 1 -2; 1 1];

B = [2; -2; 1];

X = A\B

2BAX

Page 28: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

範例:基本解 斜線和反斜線運算:

當 m < n 時,「左除」可以找到基本解 範例 6-12: leftDiv03.m

結果: X = -3.0000 0 3.3333

基本解至少有 n-m 個零。

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

B = [7; 8];

X = A\B

Page 29: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

使用「左除」進行最小平方法 問題:在平面上找出一點 P ,使得 P 到下列三條直線的距離平方和為最小:

解法:

1 =y +x

3- =y 4x

2 =4y -3x

y

xA

whereAyxL

xb

bx

,

2/1

17/3

5/2

,

2/12/1

17/117/4

5/45/3

,2

1 y x

17

3 y 4x

5

2 -4y -3x),(

2222

.is

0 line a and point a

between distanceshortest The :Hint

22

00

00

ba

cbyax

cbyax, yx

Page 30: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

類似問題 解析幾何

問題:在平面上找出一點 P ,使得 P 到下列X 的 Y 為最小

X :三條直線、三點 Y :距離和、距離平方和

古典幾何 問題:在平面上找出一點 P ,使得 P 到三角型的 X 的 Y 為最小

X :三邊、三頂點 Y :距離和、距離平方和

Page 31: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

本章指令彙整 與線性代數相關的函式,彙整如下:

類別 函式 功能 d e t 行列式 n o rm 矩陣或向量的 n o rm n o rm est 估測矩陣的 2 -n o rm n u ll N u ll 空間

o rth 垂直基底(O rth o n o rm a l B a sis)

ran k 矩陣的 ran k

rre f R ed u c ed R o w E c h e lo n F o rm

su b sp ace 子空間的夾角

矩陣 相關性質

tra c e 矩陣對角線元素的總和

Page 32: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

本章指令彙整 (2) 與線性代數相關的函式,彙整如下:

類別 函式 功能 ex p m 矩陣的指數函數 fu n m 矩陣的一般函數 lo g m 矩陣的對數函數 sq rtm 矩陣的開平方

「 \」及「 /」 左除及右除,用於解線性方程式

ch o l C h o le sk y 分解

矩陣函式

ch o lin e 不完全的 C h o le sk y 分解

Page 33: MATLAB  程式設計:進階篇 線性代數

MATLAB 程式設計進階篇:線性代數

本章指令彙整 (3) 與線性代數相關的函式,彙整如下:

類別 函式 功能

co n d 矩 陣 的 C o n d itio n N u m b er,以測試其接近 S in g u la r 的程度

co n d es t 1 -n o rm C o n d itio n N u m b er 的估計

In v 反矩陣 lu L U 分解 lu in c 不完全 L U 分解 q r Q R 分解 lsco v Q R 分解

矩陣函式

n n ls 非負的最小平方法