Python中的希尔伯特矩阵

时间:2018-12-17 23:59:33

标签: python python-3.x matrix

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

 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]  

我的错误在哪里?

2 个答案:

答案 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]