我正在分析用Python编写的Cooley-Tukey算法实现的复杂性(代码取自here):
def fft(x):
N = len(x)
print N, N//2
if N <= 1:
return x
even = fft(x[0::2])
odd = fft(x[1::2])
T = [exp(-2j*pi*k/N)*odd[k] for k in range(N//2)]
return [even[k] + T[k] for k in range(N//2)] + [even[k] - T[k] for k in range(N//2)]
该代码适用于网页中显示的示例;实际上,它似乎适用于任何长度为&lt; = 9的列表。出于某种原因,尝试使用长度列表&gt; 10:
print( ' '.join("%5.3f" % abs(f) for f in fft([0,1,2,3,4,5,6,7,8,9])))
返回以下错误:
T = [exp(-2j*pi*k/N)*odd[k] for k in range(N//2)]
IndexError:列表索引超出范围
有谁知道失败的原因?
答案 0 :(得分:2)
您使用的Cooley-Tukey实现假设输入长度是2的幂。到目前为止,Power-of-two输入长度是Cooley-Tukey最容易实现的;将此代码扩展为非幂的两个输入长度需要完全重写它。
答案 1 :(得分:1)
这是数字错误len(odd)<N//2
。以下代码
try:
T = [exp(-2j*pi*k/N)*odd[k] for k in range(N//2)]
except IndexError:
print len(odd), N
raise
将打印出来
4 10
表示N==10
,len(odd)==4
,因此您获得了IndexError。