希尔伯特矩阵是一个矩阵,其元素由下式给出:
一个<子> IJ 子> =(I + J-1) -1
所以我尝试在python中编写代码。这是我的代码:
import math
a = int(input("Enter row"))
b = int(input("Enter column"))
def hilmat(a,b):
li=[0]*b
for i in range(a):
for j in range(b):
if(i+j>0):
ele=math.pow((i+j-1),-1)
li += ele
else:
ele=math.pow((1-i-j),-1)
li += ele
j=j+1
i=i+1
return li
hilmat(a,b)
运行此命令会抛出此错误:
浮动对象不可迭代
如何解决此问题?
答案 0 :(得分:2)
此处的错误来自li += ele
;由于li
的类型为list
,因此Python将此行作为将ele
连接到li
末尾的指令;但是ele
是一个浮点数,所以这不可能,因为它不是一个列表,所以会引发错误。
由于您需要列表列表,因此最初应将li
设置为[[]]*b
;但实际上,要设置li
形状[a,b]
,您需要设置li=[[]]*a
。
在ele=math.pow((i+j-1),-1)
中,您应该注意,由于Python索引从0
开始,您可能需要使用ele=math.pow((i+j+1),-1)
。
将更多内容附加到数组的更常用语法是使用append
方法。
i=i+1
,j=j+1
都是多余的,因为for
循环已经处理了增量。事实上,它们可能会导致错误。
return li
应该与函数的其余部分缩进。
你的最终功能应该是:
def hilmat(a,b):
li=[[]]*a
for i in range(a):
for j in range(b):
ele=math.pow((i+j+1),-1)
li[i].append(ele)
return li
答案 1 :(得分:1)
操作li += ele
尝试使用可迭代li
扩展列表ele
。此处ele
不是可迭代的,而是float
,因此您要追加它。将此行替换为。
li[i].append(ele)
虽然,您可以使用单个列表理解来有效地构建此矩阵。
def hilmat(a, b):
return [[1 / (i + j + 1) for j in range(b)] for i in range(a)]
from pprint import pprint
pprint(hilmat(3, 3))
[[1.0, 0.5, 0.33],
[0.5, 0.33, 0.25],
[0.33, 0.25, 0.2]]