QR分解的三種實現方法

2021-10-09 05:19:26 字數 3598 閱讀 5698

假設原來的矩陣為[a,b],a,b為線性無關的二維向量,下面我們通過gram-schmidt正交化使得矩陣a為標準正交矩陣:

假設正交化後的矩陣為q=[a,b],我們可以令a=a,那麼我們的目的根據ab=i來求b,b可以表示為b向量與b向量在a上的投影的誤差向量:

為givens矩陣(初等旋轉矩陣),也記作

由givens矩陣所確定的線性變換稱為givens變換(初等旋轉變換)。

實數

平面直角座標系中,將向量

5 """gram-schmidt正交化"""

6 q=np.zeros_like(a)

7 cnt = 0

8 for a in a.t:

9 u = np.copy(a)

10 for i in range(0, cnt):

11 u -= np.dot(np.dot(q[:, i].t, a), q[:, i]) # 減去待求向量在以求向量上的投影

12 e = u / np.linalg.norm(u) # 歸一化

13 q[:, cnt] = e

14 cnt += 1

15 r = np.dot(q.t, a)

16 return (q, r)

17 18 def givens_rotation(a):

19 """givens變換"""

20 (r, c) = np.shape(a)

21 q = np.identity(r)

22 r = np.copy(a)

23 (rows, cols) = np.tril_indices(r, -1, c)

24 for (row, col) in zip(rows, cols):

25 if r[row, col] != 0: # r[row, col]=0則c=1,s=0,r、q不變

26 r_ = np.hypot(r[col, col], r[row, col]) # d

27 c = r[col, col]/r_

28 s = -r[row, col]/r_

29 g = np.identity(r)

30 g[[col, row], [col, row]] = c

31 g[row, col] = s

32 g[col, row] = -s

33 r = np.dot(g, r) # r=g(n-1,n)*...*g(2n)*...*g(23,1n)*...*g(12)*a

34 q = np.dot(q, g.t) # q=g(n-1,n).t*...*g(2n).t*...*g(23,1n).t*...*g(12).t

35 return (q, r)

36 37 def householder_reflection(a):

38 """householder變換"""

39 (r, c) = np.shape(a)

40 q = np.identity(r)

41 r = np.copy(a)

42 for cnt in range(r - 1):

43 x = r[cnt:, cnt]

44 e = np.zeros_like(x)

45 e[0] = np.linalg.norm(x)

46 u = x - e

47 v = u / np.linalg.norm(u)

48 q_cnt = np.identity(r)

49 q_cnt[cnt:, cnt:] -= 2.0 * np.outer(v, v)

50 r = np.dot(q_cnt, r) # r=h(n-1)*...*h(2)*h(1)*a

51 q = np.dot(q, q_cnt) # q=h(n-1)*...*h(2)*h(1) h為自逆矩陣

52 return (q, r)

53 54 np.set_printoptions(precision=4, suppress=true)

55 a = np.array([[6, 5, 0],[5, -1, 4],[5, 1, -14],[0, 4, 3]],dtype=float)

56 57 (q, r) = gram_schmidt(a)

58 print(q)

59 print(r)

60 print np.dot(q,r)

61 62 (q, r) = givens_rotation(a)

63 print(q)

64 print(r)

65 print np.dot(q,r)

66 67 (q, r) = householder_reflection(a)

68 print(q)

69 print(r)

70 print np.dot(q,r)

三種實現執行緒的方法

1.通過繼承thread實現執行緒 public class mythread extends thread public static void main string args 2.通過實現runnable實現執行緒 public class runnabledemo implements ru...

三種實現委託的方法

先看 申明乙個帶引數的委託 delegate void delegatetest string name class program testdg2 匿名方法 delegatetest testdg3 x testdg3 lambda 表示式 console.readkey 建立乙個靜態方法,傳入委...

Spring AOP的三種實現方法

aop aspect oriented programming 面向切面程式設計 原生介面實現方式 前置日誌 public class logimplements methodbeforeadvice public class afterlog implements afterreturningad...