использование комплексных чисел в С++

У меня проблема с использованием fftw (3.3).

Что я делаю, так это сначала создаю план:

int n = 100;
vector<double> f,step;
vector<complex<double> > F;
fftw_plan p;

f.resize(n);
F.resize(n);
p = fftw_plan_dft_r2c_1d(n,&f[0], &F[0],FFTW_ESTIMATE);

Тогда я получаю ошибку:

main.cpp:19:58: error: cannot convert ‘std::complex<double>*’ to ‘double (*)[2]’ for argument ‘3’ to ‘fftw_plan_s* fftw_plan_dft_r2c_1d(int, double*, double (*)[2], unsigned int)’

Насколько я понял, вместо fftw_complex и вектора можно использовать стандартный комплекс.

Я уверен, что я упустил простой момент здесь. Так что любая помощь будет принята с благодарностью.

магу_


person magu_    schedule 11.04.2013    source источник
comment
Fftw_complex сильно отличается от сложных типов C++. Попробуйте решения здесь   -  person DOOM    schedule 11.04.2013
comment
На самом деле std::complex<double> не отличается (по памяти) в C++11, поэтому вы можете просто сделать reinterpret_cast для элемента.   -  person filmor    schedule 11.04.2013
comment
Спасибо за ответы. @ DOOM: я не думаю, что это проблема, хотя я проверю это. Почему-то cygwin не очень доволен мьютексом. Но я попытаюсь убедить его. @filmor: извините за этот глупый вопрос, но правильно ли это: p = fftw_plan_dft_r2c_1d(n,&f[0], &reinterpret_cast‹fftw_complex›(F[0]),FFTW_ESTIMATE); потому что теперь он говорит: main.cpp: 26:75: ошибка: недопустимое преобразование из типа «std::complex‹double›» в тип «double [2]»   -  person magu_    schedule 11.04.2013


Ответы (1)


Способ @filmor сработал. Для полноты правильная строка кода будет:

 p = fftw_plan_dft_r2c_1d(n, &f[0], reinterpret_cast<fftw_complex*>(&F[0]), FFTW_ESTIMATE);

Более общее описание описано здесь.

person magu_    schedule 12.04.2013
comment
Похоже, ваши фактические потребности изменились с тех пор, как вы разместили свой вопрос (теперь вы создаете вектор планов из вектора входных данных). Возможно, вы захотите убрать fft[0]. из каждой переменной, чтобы она читалась вместе с исходным вопросом. *просто мое мнение - person tir38; 29.04.2013