我想在没有矩阵-矩阵乘法的情况下实现一个 givenRotation 算法。矩阵向量很好或仅用于循环。我要分解一个矩形(m+1)xm Hessenberg 矩阵。
我在这里找到了一个算法,但它似乎适用于方阵。
通过矩阵矩阵乘法,我在 python 中制作了以下脚本。主要目标是用 C++ 实现。
def rotationCoefficients(a, b):
if (b == 0):
c = 1
s = 0
else:
if (np.abs(a) > np.abs(b)):
tan = b/a
c = 1 / np.sqrt(1 + tan**2)
s = c*tan
else:
cot = a/b
s = 1/np.sqrt(1 + cot**2)
c = s*cot
return c, s
def QR_givensRotation(A):
m, n = A.shape
Q = np.eye(m)
R = A.copy()
for j in np.arange(n):
for i in np.arange(j+1, m)[::-1]:
x = R[:,j]
c, s = rotationCoefficients(x[i-1], x[i])
G = np.eye(m)
G[i-1 : i+1, i-1 : i+1] = np.array([[c, -s],[s, c]])
R = G.T @ R
Q = Q @ G
return Q, R
有没有人有一个没有矩阵矩阵乘法的算法来将给定的旋转应用于 Hessenberg 矩阵?