首页 > 解决方案 > 在 Python 中使用自定义函数计算矩阵 A 的 Gram-Schmidt 会扭曲 A

问题描述

我实现了经典的 Gram-Schmidt 过程,如下所示:

def cgs(A):
    '''
    Implements classical Gram-Schmidt process.

    Inputs
        A: numpy.ndarray of shape (M, N)
    
    Outputs
        Q: numpy.ndarray of shape (M, N)
        R: numpy.ndarray of shape (N, N)
    '''
    print(A)

    M, N = A.shape
    Q = np.zeros((M, N))
    R = np.zeros((N, N))

    for i in range(N):
        v_i = A.T[i]
        for j in range(i):
            v_i -= np.inner(Q.T[j], A.T[i]) * Q.T[j]
        Q.T[i] = v_i / np.linalg.norm(v_i, ord=2)

    print(A)

    for i in range(N):
        for j in range(i, N):
            R[i][j] = np.inner(A.T[j], Q.T[i])
    
    return Q, R

在主程序中,我运行了以下代码:

A = np.array([[1, 1, 0], [1, 0, 1], [0, 1, 1]], dtype=np.float64)
Q, R = cgs(A)
print(Q)
print(R)
print(Q @ R)

当我运行此代码时,打印结果如下:

[[1. 1. 0.]
 [1. 0. 1.]
 [0. 1. 1.]]
[[ 1.          0.5        -0.66666667]
 [ 1.         -0.5         0.66666667]
 [ 0.          1.          0.66666667]]
[[ 0.70710678  0.40824829 -0.57735027]
 [ 0.70710678 -0.40824829  0.57735027]
 [ 0.          0.81649658  0.57735027]]
[[ 1.41421356e+00  1.34015774e-16  7.08401324e-17]
 [ 0.00000000e+00  1.22474487e+00 -4.68509055e-17]
 [ 0.00000000e+00  0.00000000e+00  1.15470054e+00]]
[[ 1.          0.5        -0.66666667]
 [ 1.         -0.5         0.66666667]
 [ 0.          1.          0.66666667]]

前两个矩阵是print(A)函数cgs中的结果,后三个矩阵是主程序的结果。

我在这里想知道的是,即使没有任何代码更改between two的值,print(A)函数中两个的结果也不相同。cgsAprint(A)

谁能帮我弄清楚?

我不知道这里发生了什么。

标签: python

解决方案


推荐阅读