示例#1
0
def matrix_QR_factorization_householder(matrix):
    matrix_R = [[matrix[j][i] for i in range(len(matrix[0]))]
                for j in range(len(matrix))]  #HA starts by being A
    matrix_Q = [[0 for j in range(len(matrix))] for k in range(len(matrix))
                ]  #Q starts by being the identity matrix

    for j in range(len(matrix)):
        matrix_Q[j][j] = 1
    for i in range(len(matrix[0]) - 1):
        a = [
            matrix_R[j][i] for j in range(len(matrix_R))
        ]  #a is the i'th column of matrix_R, with 0s inserted above the diagonal
        for j in range(i):
            a[j] = 0
        r = [0] * len(
            a
        )  #r is just a 0 vector, with the i'th column being the magnitude of a
        r[i] = vector_2norm(a)
        u = vector_add(a, vector_scal_mult(-1, r))
        i_ = [[0 for j in range(len(matrix))] for k in range(len(matrix))]
        for j in range(len(matrix)):
            i_[j][j] = 1
        if vector_dot(u, u) != 0:
            h = matrix_add(i_,
                           matrix_scal_mult(-2 / vector_dot(u, u),
                                            matrix_outer(u, u)))  #computer h_i
        else:  #if u ends up being the 0 matrix, then h is just the identity matrix
            h = i_
        matrix_Q = matrix_mult(matrix_Q, h)
        matrix_R = matrix_mult(h, matrix_R)

    return [matrix_Q, matrix_R]
def matrix_power_iteration(matrix, tol, max_iter):
    error = tol * 10
    count = 0
    eigenvaluenew = 1
    v_i = convert_vec_mat(matrix[0])
    while error > tol and count < max_iter:
        eigenvalueold = eigenvaluenew
        v_i = matrix_mult(matrix, v_i)
        v_i = matrix_scal_mult(1 / vector_2norm(convert_vec_mat(v_i)), v_i)
        eigenvaluenew = matrix_mult(matrix_transpose(v_i),
                                    matrix_mult(matrix, v_i))[0][0]
        count += 1
        error = abs(eigenvaluenew - eigenvalueold)
    return eigenvaluenew