我知道这个话题已经被多次讨论,提前道歉。我只是无法解决一个效率低下的for循环操作,希望你能帮助我。
我正在实现一个单一的for循环,用于求和时域周期数据。我使用之前从FFT获取的傅里叶系数。我的问题是,我需要添加额外的时域数据到周期信息中,所以我不能简单地使用逆FFT操作。我基本上正在编辑标准离散傅里叶变换(DFT)和,即:
在这个系列中,F是我的傅里叶系数,ω是频率向量,t是时间向量。我必须修改总和,使其看起来像这样:
唯一的变化是我现在包括了一个向量,它是一个时间域函数(例如正弦波),我称之为xt。问题是时间域信息必须有极其细微的分辨率(10秒录音大约长度为5e6)。我不能缩短时间长度,因为我需要高频率分辨率。这导致我的机器上单个函数评估大约需要7小时的时间(我不得不承认,这不是最好的情况)。我需要在优化设置中评估函数,因此7小时的函数评估时间是不可行的。
我尝试过将操作向量化,但矩阵变得太大,我的计算机无法处理,并且MATLAB已经更新以更有效地处理for循环。我尝试编写自己的快速傅里叶变换版本,但由于我在每个步骤中编辑频率信息,某些Cooley和Tukey算法所需的假设就会破裂。有谁知道如何将上述求和重写为更有效的格式吗?我已经预先分配了向量。
我正在实现一个单一的for循环,用于求和时域周期数据。我使用之前从FFT获取的傅里叶系数。我的问题是,我需要添加额外的时域数据到周期信息中,所以我不能简单地使用逆FFT操作。我基本上正在编辑标准离散傅里叶变换(DFT)和,即:
for k = 1:L
x = x + F(k+1)*exp(1j*(omega(k+1)*t));
end
在这个系列中,F是我的傅里叶系数,ω是频率向量,t是时间向量。我必须修改总和,使其看起来像这样:
for k = 1:L
x = x + F(k+1)*exp(1j*(omega(k+1)*t)+1j*k*xt);
end
唯一的变化是我现在包括了一个向量,它是一个时间域函数(例如正弦波),我称之为xt。问题是时间域信息必须有极其细微的分辨率(10秒录音大约长度为5e6)。我不能缩短时间长度,因为我需要高频率分辨率。这导致我的机器上单个函数评估大约需要7小时的时间(我不得不承认,这不是最好的情况)。我需要在优化设置中评估函数,因此7小时的函数评估时间是不可行的。
我尝试过将操作向量化,但矩阵变得太大,我的计算机无法处理,并且MATLAB已经更新以更有效地处理for循环。我尝试编写自己的快速傅里叶变换版本,但由于我在每个步骤中编辑频率信息,某些Cooley和Tukey算法所需的假设就会破裂。有谁知道如何将上述求和重写为更有效的格式吗?我已经预先分配了向量。
for k = 1:L x = x + F(k+1)*exp(1j*(omega(k+1)*t)+1j*k*xt); ## 每次迭代都会更新x,然后在指数中使用x end
- gariepyF
和调整xt
所代表的内容,你可能可以忽略其中很多。 - Sanjay Manohar