【发布时间】:2013-10-18 10:21:35
【问题描述】:
我是 EE,不是代码专家,所以请多多包涵。
我正在使用 Embarcadero C++ Builder (XE3)。
我有一个 FFT 算法,它可以对复数进行大量运算。我发现如果我绕过 Embarcadero 的复杂数学库,并在我自己的代码中进行所有计算,我的 FFT 将运行大约 4.5 倍的速度。此处显示的 4 个操作都需要过多的时间。
#include <dinkumware\complex>
#define ComplexD std::complex<double>
ComplexD X, Y, Z, FFTInput[1024];
double x, y;
Z = X * Y;
x = X.real();
y = X.imag();
Z = ComplexD(x,y);
用我自己的交叉乘法替换乘法将我的执行时间减半。然而,我担心的是我访问输入数组的实部和虚部的方式。我正在这样做:
double *Input;
Input = reinterpret_cast<double *>(FFTInput);
// Then these statements are equivalent.
x = FFTInput[n].real();
y = FFTInput[n].imag();
x = Input[2*n];
y = Input[2*n+1];
这样做将我的执行时间再次缩短了一半,但我不知道这个 reinterpret_cast 是否明智。我可以将输入数组更改为两个双精度数而不是一个复数,但我在许多程序中都使用这个 FFT,并且不想重写所有内容。
这个 reinterpret_cast 可以吗,还是会出现内存问题?另外,有没有办法让 Embarcadero 复杂的数学函数运行得更快?最后,虽然它对我来说不是很重要,但这个 reinterpret_cast 是否可移植?
【问题讨论】:
-
你说你是EE,是什么?
-
有效吗?结果正确吗?您似乎很关心速度,但如果没有正确性,速度就毫无意义。
-
reinterpret_cast永远不会完全正常,这是一个问题,即在您的机器上是否可以使用您的编译器。看起来你将能够摆脱它。但我会改为调查更改编译器 -
@piokuc 我想的电气工程师。
-
与您的问题无关,但强烈提示:
#define ComplexD std::complex<double>是 BAD CODE。改为这样做:typedef std::complex<double> ComplexD;
标签: c++ c++builder reinterpret-cast