C++ 如何使用快速傅里叶变换计算阵列元素的乘积之和?

C++ 如何使用快速傅里叶变换计算阵列元素的乘积之和?,c++,arrays,c++11,sum,fft,C++,Arrays,C++11,Sum,Fft,我有一些二进制数组。例如,让我的数组为: int a[] = {1, 0, 0, 0, 1, 0, 1, 0, 1} 我想根据以下公式计算值: 如何使用快速傅里叶变换计算此函数?我有一个大数组,我必须多次计算这个函数。所以,我希望能够快速计算这个函数。你所做的计算基本上是一个卷积,时域中的卷积只是频域中的乘法。所以只要得到a的FFT,并将其与自身相乘,然后执行IFFT返回到时域。简言之,你可以通过 void main() { int i,k,sum=0; for(i=0;i&

我有一些二进制数组。例如,让我的数组为:

int a[] = {1, 0, 0, 0, 1, 0, 1, 0, 1}
我想根据以下公式计算值:


如何使用快速傅里叶变换计算此函数?我有一个大数组,我必须多次计算这个函数。所以,我希望能够快速计算这个函数。

你所做的计算基本上是一个卷积,时域中的卷积只是频域中的乘法。所以只要得到a的FFT,并将其与自身相乘,然后执行IFFT返回到时域。简言之,你可以通过

void main()
{
    int i,k,sum=0; 
    for(i=0;i<9;i++)
    {
        for(k=0;k<2*i;k++) 
        {
            sum + =(a[k]*a[2*i-k]; // calculating B
        }
    }
    cout<<sum;
}
b(2*i) = IFFT( FFT(a[0:2*i)]).FFT(a[0:2*i]) ) 

2i是b的参数,它可以是介于0和数组大小之间的任何值,你想快速计算任何参数的b吗?真的有必要使用FT-stuff吗?@deviantfan,是的,2i是b的参数,它可以是0和数组大小之间的任何值,我想快速计算任何参数的b。我不知道在没有傅立叶变换的情况下如何快速计算这个函数。我相信傅立叶变换是不必要的。看起来你在做卷积积,因此你确实可以用FFT来快速计算。看一看。请注意,使用FFT,您将计算所有的b值,如果您只需要很少的b值,我认为这不是一个好主意。我的头痛:玩笑不说,我从来都不是一个伟大的数学家,但我想知道一个简单的循环和编译器优化是否太慢,不值得使用它。而且它很容易编码……好吧,假设你想要所有的b值,一个简单的算法的复杂性是^2-N是i的数目。而基于FFT的算法在logN上会有复杂度。因此,如果你要非常大的N,你可以有一个很大的好处与FFT。