没有矩阵-矩阵乘法的Givens旋转算法

计算科学 线性求解器 稀疏矩阵 矩阵分解
2021-12-07 20:19:32

我想在没有矩阵-矩阵乘法的情况下实现一个 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 矩阵?

1个回答

要应用旋转,您只需修改行ii+1. 所以,你可以写RGR作为

R[一世一世+1,]G[一世一世+1,一世一世+1]R[一世一世+1,],
这只是一个2×2×n矩阵产品。同样对于, 你可以得到
[,一世一世+1][,一世一世+1]G[一世一世+1,一世一世+1].

您可能想查看 BLAS 的?rot例程(其中?之一是s, d, cz具体取决于您的数据类型)。