我正在研究幂方法的实现,以计算给定矩阵的主要特征向量和特征值。我没有发布完整的代码,我宁愿提出一些我无法理解的具体问题。
在以下循环中,我通过为每个步骤分配计算的x0
来更新x
。这很好,但是,我需要计算每个步骤中x
和x0
之间的差异,并将它们保存在名为epsilon
的变量中。
由于x0
分配在epsilon
计算之后的行中,我预计这会有效,但在第一轮循环之后我得到的epsilon
是{{1} }原因是0
和x0
在每一步都是相同的。
我一直在考虑这个问题,但我很欣赏一些暗示我做错了什么。
x
答案 0 :(得分:2)
由于x
和x0
是数组,因此会出错。行x0 = x
不会复制数据,而是使x
和x0
都指向相同的数据。在第一次完成后,它们将保持不变。
如果您要将数据从x
复制到x0
,则应使用x0 = x[:]
。切片语法([:]
)创建数据的副本,因此应该可以工作。
答案 1 :(得分:2)
这是Python中常见错误之一的结果。当我们有一个列表b
并设置a=b
时,我们不会将a
的每个值设置为等于b
的每个值。相反,我们将它们设置为相同的东西它们在内存中的位置相同。对其中一个的任何改变都会改变另一个。任何时候你有两个似乎总是相同的列表(或任何python对象),或者一个对象似乎在你不期望的时候改变,你应该总是检查你是否已经完成了这个。
x0 = x[:]
如果它是一个列表并且,将会执行您之后的操作
x0 = x.copy()
如果它是numpy。
假设这些是numpy数组,您还可以通过设置
来改进代码x = y/normy
epsilon = x-x0
而不是在循环中进行。它会更快,因为numpy已经过优化,可以做到这一点。