15

FFTW 手册说它的类型与 STLfftw_complex中的类有点兼容。std::complex<double>但这对我不起作用:

#include <complex>
#include <fftw3.h>
int main()
{
   std::complex<double> x(1,0);
   fftw_complex fx;
   fx = reinterpret_cast<fftw_complex>(x);
}

这给了我一个错误:

error: invalid cast from type ‘std::complex<double>’ to type ‘double [2]’

我究竟做错了什么?

4

3 回答 3

23

fftw_complex 与 C99 和 C++ 复杂类型的位兼容性背后的想法不是它们可以很容易地相互创建,而是 FFTW 中所有采用指向 fftw_complex 的指针的函数也可以采用指向 c++ std::complex 的指针。因此,最好的方法可能是在整个程序中使用 std::complex<> 并且仅在调用 FFTW 函数时将指针转换为这些值:

std::vector<std::complex<double> > a1, a2;
....
....
fftw_plan_dft(N, reinterpret_cast<fftw_complex*>(&a1[0]),
                 reinterpret_cast<fftw_complex*>(&a2[0]),
                 FFTW_FORWARD, FFTW_ESTIMATE);
....
于 2012-12-01T23:32:59.383 回答
8

重写你的代码如下:

#include <complex>
#include <fftw3.h>
int main()
{
   std::complex<double> x(1,0);
   fftw_complex fx;
   memcpy( &fx, &x, sizeof( fftw_complex ) );
}

我使用的每个编译器都会优化 memcpy,因为它正在复制固定的数据量,即在编译时。

这避免了指针别名问题

编辑:您还可以使用联合来避免严格的别名问题,如下所示:

#include <complex>
#include <fftw3.h>
int main()
{
   union stdfftw
   {
       std::complex< double > stdc;
       fftw_complex           fftw;
   };
   std::complex<double> x(1,0);
   stdfftw u;
   u.stdc = x;
   fftw_complex fx = u.fftw;
}

虽然严格来说,这个 C99 规则(不确定 C++)被破坏了,因为从联合的不同成员读取到写入的那个也是未定义的。它适用于大多数编译器。我个人更喜欢我原来的方法。

于 2010-11-18T11:52:24.267 回答
6

reinterpret_cast仅适用于指针和引用。所以你必须这样做:

#include <complex>
#include <fftw3.h>
int main()
{
   std::complex<double> x(1,0);
   fftw_complex fx(*reinterpret_cast<fftw_complex*>(&x));
}

这假设fftw_complex有一个复制构造函数。为了避免严格混叠的问题,应该首选Goz 的解决方案。

于 2010-11-18T11:51:55.943 回答