在FFTW手册fftw_complex类型是位兼容std::complex<double>在STL类。但是,这并不为我工作:

#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]’

我在做什么错了?

有帮助吗?

解决方案

如下重新编写代码:

#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 ++)被分解为从联合到一个写入太的不同成员读取未定义。它适用于大多数编译器虽然。我个人更我的原始方法。

其他提示

后面的fftw_complex和C99和C ++复杂类型位兼容性的想法是不它们可以彼此容易产生,但在FFTW称取指针fftw_complex所有功能也可以采取指针C ++的std ::复杂。因此,最好的办法可能是使用std ::复杂<>整个程序,只调用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);
....

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具有拷贝构造。为了避免严格别名问题,戈兹贝达的解决方案应该是优选的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top