Python中的希尔伯特矩阵

Hilbert Matrix in Python

本问题已经有最佳答案,请猛点这里访问。

希尔伯特矩阵是一个方形矩阵,其元素由以下公式给出:

1
 A[i][j]= 1 / (i+j+1)

我的代码是:

1
2
3
4
5
6
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
2
3
[1, 1/2, 1/3]  
[1/2, 1/3, 1/4]  
[1/3, 1/4, 1/5]

但它返回3行

1
[1/3, 1/4, 1/5]

我的错误在哪里?


错误出现在H初始化部分:

H=[〔0〕*n〕* n

这将创建对相同、内部和列表的引用列表。因此,所有行返回相同的值。

尝试:

范围(n)内i的h=[[0]*n


当你这样做的时候

1
H = [[0]*n]*n

最后一个*n制作了第一个[0 0 0 .... (n)]列表的浅拷贝。通过修改第一列中的任何元素,可以更改所有列(列表中的项是对第一列的引用)。

numpy适合数组操作,但如果不想使用它,请尝试

1
H = [[0]*n for i in xrange(n)]

要查看是否有指向相同整数的元素,可以尝试

1
2
3
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)

旁白:用麻木的

1
H = np.zeros((n, n))

参考:https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.zeros.html