希尔伯特矩阵是一个方阵,其元素由下式给出:
A[i][j]= 1 / (i+j+1)
我的代码是:
def Hilbert(n):
H = [[0]*n]*n
for i in range(n):
for j in range(n):
H[i][j] = 1/(i+j+1)
return H
例如对于n = 3,它应该返回
[1, 1/2, 1/3]
[1/2, 1/3, 1/4]
[1/3, 1/4, 1/5]
但它返回3行
[1/3, 1/4, 1/5]
我的错误在哪里?
答案 0 :(得分:0)
完成时
H = [[0]*n]*n
最后一个*n
制作第一个[0 0 0 .... (n)]
列表的浅表副本。通过修改第一列中的任何元素,可以更改所有列(列表中的项目是对第一列的引用)。
Numpy对于数组操作很有用,但是如果您不想使用它,请尝试
H = [[0]*n for i in xrange(n)]
要查看是否有指向相同整数的元素,可以尝试
for i in range(n):
for j in range(n):
print(id(H[i][j])) # [id() is the memory address](https://docs.python.org/2/library/functions.html#id)
在旁边:使用numpy是
H = np.zeros((n, n))
ref:https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.zeros.html
答案 1 :(得分:0)
错误在于H init部分:
H = [[0] * n] * n
此创建对相同内部列表的引用的列表。 因此,所有行都返回相同的值。
尝试:
H = [[0] * n对于范围(n)中的i]