Двумерный вектор
Пытаюсь организовать двумерное FFT. Нужно сделать именно через двумерный вектор. Подскажите пожалуйста, что не так с этим кодом
const int RR = 8;
const int CC = 8;
vector<vector<complex<double>> > matrix;
for (int i = 0; i < RR; i++)
{
vector<complex<double>> myvector;
for (int j = 0; j < CC; j++)
{
complex<double> tempVal = { 1,0 };
myvector.push_back(tempVal);
}
matrix.push_back(myvector);
}
for (int i = 0; i < RR; i++)
{
for (int j = 0; j < CC; j++)
{
cout << matrix[i][j] << " ";
}
cout << '\n';
}
cout << endl;
fftw_plan plan = fftw_plan_dft_2d(
RR,
CC,
(fftw_complex*) matrix.data(),
(fftw_complex*) matrix.data(),
FFTW_FORWARD,
FFTW_ESTIMATE);
fftw_execute(plan);
fftw_destroy_plan(plan);
for (int i = 0; i < RR; i++)
{
for (int j = 0; j < CC; j++)
{
cout << matrix[i][j] << " ";
}
cout << '\n';
}
cout << endl;
Ответы (1 шт):
FFTW работает с массивом или с указателем на непрерывную область данных. Организация массива описана в документации (в частности, массив должен быть чуть больше, чем произведение размерностей)
Однако строки двумерного вектора хранятся в разных областях памяти, поэтому при своей работе FFTW попадает в чужие области памяти - вот и нарушение доступа.
Используйте одномерный вектор, либо при использовании двумерного вектора делайте раздельные одномерные Фурье по строкам и по столбцам - для второй части FFTW использовать не получится без перепаковки данных.
Можно использовать свою реализацию FFT с любой, какой захочется, организацией входных данных, если скорость не так уж важна.