由Herb Sutter的引人注目的演讲启发不是你父亲的C ++ ,我决定再看看C的最新版本++使用微软的Visual Studio 2010中我是赫伯的说法,C ++是“安全,快速”,因为我写了很多特别感兴趣性能关键代码。
作为一个标杆,我决定尝试写同样简单的FFT算法在不同的语言。
我想出了下面的C ++代码11,使用内置的complex
型和vector
集合:
#include <complex>
#include <vector>
using namespace std;
// Must provide type or MSVC++ barfs with "ambiguous call to overloaded function"
double pi = 4 * atan(1.0);
void fft(int sign, vector<complex<double>> &zs) {
unsigned int j=0;
// Warning about signed vs unsigned comparison
for(unsigned int i=0; i<zs.size()-1; ++i) {
if (i < j) {
auto t = zs.at(i);
zs.at(i) = zs.at(j);
zs.at(j) = t;
}
int m=zs.size()/2;
j^=m;
while ((j & m) == 0) { m/=2; j^=m; }
}
for(unsigned int j=1; j<zs.size(); j*=2)
for(unsigned int m=0; m<j; ++m) {
auto t = pi * sign * m / j;
auto w = complex<double>(cos(t), sin(t));
for(unsigned int i = m; i<zs.size(); i+=2*j) {
complex<double> zi = zs.at(i), t = w * zs.at(i + j);
zs.at(i) = zi + t;
zs.at(i + j) = zi - t;
}
}
}
请注意,此功能仅适用于n
-元素的向量,其中n
是2的整数次幂。 任何人都希望快速FFT代码,对任何工作n
应该看看FFTW 。
据我了解,传统的xs[i]
从C语法用于索引一个vector
不会做边界检查,因此,是不是内存安全的,可以是内存错误,如非确定性的腐败和内存访问冲突的来源。 所以我用xs.at(i)
来代替。
现在,我想这个代码是“安全,快速”的,但我不是一个C ++ 11个专家,所以我想请为改善此代码,将使它更地道或有效率?