python - 在 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)
函数中两个的结果也不相同。cgs
A
print(A)
谁能帮我弄清楚?
我不知道这里发生了什么。
解决方案
推荐阅读
- java - 如何将 Java AES ECB 加密代码转换为 Nodejs
- javascript - 如何在网站上选择框架元素?
- android - androidx.collection.ArrayMap 与 android.util.ArrayMap 有什么区别?
- java - 一个奇怪的 RecyclerView 故障
- mongodb - MongoDB - 使用字符串数组过滤器查询嵌套数组中的嵌套对象
- google-sheets - 根据另一行的条件在一行中获取多个值
- android - ARCore Unity - Proguard 问题
- javascript - Input type="file" 与另一种输入类型一起使用时表现出奇怪的行为
- python - 为什么不使用 retain_graph=True 会导致错误?
- bash - 每小时安排的 crontab 任务从上午 11 点到 12 点停止运行