给定 Aasen 算法的一种非枢轴形式,如何添加枢轴?

计算科学 线性代数
2021-12-10 15:29:11

我已经实现了 Matrix Computations 4th Edition 一书中描述的 Aasen 算法版本。那里的版本没有旋转。这本书对如何添加旋转的描述对我来说有点粗略。有人可以用实际代码说明如何添加透视吗?

我应该补充一点,我的实现支持 Hermitian 矩阵,这与书中的不同。

from sympy import *

def aasen(A):
    """Aasen without pivoting, but with support for Hermitian matrices."""
    n = A.rows
    alpha = zeros(n,1)
    beta = zeros(n,1)
    L = eye(n)
    h = zeros(n,1)
    v = zeros(n,1)
    for j in range(n):
        if j == 0:
            alpha[0] = A[0,0]
            v[1:n,0] = A[1:n,0]
        else:
            h[0] = beta[0].conjugate() * L[j,1].conjugate()
            for k in range(1,j):
                h[k] = beta[k-1] * L[j, k-1].conjugate() + alpha[k] * L[j,k].conjugate() + beta[k].conjugate() * L[j,k+1].conjugate()
            h[j] = A[j,j] - L[j,0:j].dot(h[0:j])
            alpha[j] = h[j] - beta[j-1] * L[j,j-1].conjugate()
            v[j+1:n,0] = A[j+1:n,j] - L[j+1:n,0:j+1] * Matrix(h[0:j+1])
        if j <= n-2:
            beta[j] = v[j+1]
        if j <= n - 3:
            L[j+2:n,j+1] = Matrix(v[j+2:n]) / v[j+1]
    T = zeros(n,n)
    for i in range(n):
        for j in range(n):
            if i == j+1:
                T[i,j] = beta[j]
            elif i == j:
                T[i,j] = alpha[j]
            elif j == i+1:
                T[i,j] = beta[i].conjugate()
    return L, T
0个回答
没有发现任何回复~