QR分解:
有很多方法可以进行QR迭代,本文使用的是Schmidt正交化方法
具体证明请参考链接 https://wenku.baidu.com/view/c2e34678168884868762d6f9.html
迭代格式
实际在进行QR分解之前一般将矩阵化为上hessnberg矩阵(奈何这个过程比较难以理解,本人智商不够,就不做这一步了哈哈哈)
迭代终止条件
看了很多文章都是设置一个迭代次数,感觉有些不是很合理,本来想采用A(k+1)-A(k)的对角线元素的二范数来作为误差的,但是我有没有一些严格的证明,所以本文也采用比较大众化的思路,设置迭代次数。
Python实现
1 M = [[2, 4, 2], [-1, 0, -4], [2, 2, 1]] 2 3 import copy 4 import math 5 6 7 class QR(object): 8 9 def __init__(self, data): 10 self.M = data 11 self.degree = len(data) 12 13 def get_row(self, index): 14 res = [] 15 for i in range(self.degree): 16 res.append(self.M[i][index]) 17 return res 18 19 def get_col(self, index): 20 res = [] 21 for i in range(self.degree): 22 res.append(self.M[i][index]) 23 return res 24 25 @staticmethod 26 def dot(m1, m2): 27 res = 0 28 for