嘿所有,所以我在python中为一个类实现了离散傅立叶变换的简单版本,但是我的输出发生了一些奇怪的事情,我不明白为什么。例如,如果我的输入是[a,b,c,d],则值会像[a',d',c',b']一样被扰乱,列表的头部位于同一位置,但其他值则反转。这是我的代码:
def DFT(pts, carr):
t = time.clock()
F =[0]*pts
for k in range(pts):
c = 2j*k*math.pi/pts
for n in range(pts):
F[k] += complex(carr[n]) * cmath.exp(n*c)
t = time.clock()-t
print(str(pts) + " point DFT finished in " + str(t) + "s")
return F
这是非常简单的,但由于某种原因,它正在围绕所有不知名的方式翻转阵列,我不知道为什么。有人知道这里发生了什么吗?我确定输入的顺序正确。
答案 0 :(得分:4)
我相信你在c
的计算中错过了一个负号(见this link)。
使用您的代码:
>>> DFT(4, [1, 2, 3, 4])
4 point DFT finished in 0.0310370227732s
[(10+0j), (-2.0000000000000004-1.9999999999999996j), (-2+9.797174393178826e-16j), (-1.9999999999999982+2.000000000000001j)]
缺少负号:
>>> DFT(4, [1, 2, 3, 4])
4 point DFT finished in 4.17962941128e-05s
[(10+0j), (-2.0000000000000004+1.9999999999999996j), (-2-9.797174393178826e-16j), (-1.9999999999999982-2.000000000000001j)]
答案 1 :(得分:-1)
在您提供的特定代码段中,除了赋值给F之外,我们看不到任何列表操作。再次,您不需要使用+ =运算符,只需使用=就可以了。 除此之外,请考虑列表分配的这种简单情况,它可以帮助您跟踪代码中的问题。
将列表分配给新列表时。它们引用同一个对象。因此,如果您修改新的原始版本也会被修改。我假设你的代码中发生了这些问题。
>>> l = [1,2,3,4]
>>> n = l
>>> n.reverse()
>>> n
[4, 3, 2, 1]
>>> l
[4, 3, 2, 1]