問題の鋳造STLコンプレックス<ダブル>へfftw_complex
-
26-09-2019 - |
質問
FFTWマニュアルは、そのfftw_complex
タイプはビットであることをを言いますSTLでクラスを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]’
私は間違って何をしているのですか?
解決
次のようにコードを再書き込みます:
#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_complexへのポインタを取るFFTWのすべての機能も++のstd Cへのポインタを取ることができること::複雑な。したがって、最善のアプローチは、あなたのプログラム全体で<> ::利用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
は、コピーコンストラクタを持っていることを前提としています。厳格なエイリアシングの問題を避けるために、ゴズのソリューションにはすべき好ましくあります。
所属していません StackOverflow