Python实现经典Gram-Schmidt矩阵分解时原输入矩阵被意外修改问题
问题原因
你的代码出现这个问题的核心是NumPy数组的视图(View)机制:普通索引/切片获取的数组片段不会生成独立副本,只是原数组的一个引用,对这个片段的原地修改会直接作用到原数组上。
具体到你的代码逻辑里:
你在循环中写了v_i = A.T[i],A.T是原数组的转置,A.T[i]对应的就是原数组A的第i列,这行代码并没有生成新的数组,只是得到了原A第i列的引用。后续你执行v_i -= np.inner(Q.T[j], A.T[i]) * Q.T[j]是对v_i的原地修改操作,相当于直接修改了原数组A的对应列,所以两次打印A的结果会出现差异。
修复方案
只需要在获取v_i的时候主动创建独立副本即可,将对应代码行修改为:
v_i = A.T[i].copy()
修改后对v_i的所有操作都只会作用在副本上,不会修改原数组A,两次打印的结果就会一致了。
内容的提问来源于stack exchange,提问作者AABBCC
相关产品推荐
相关产品推荐

