Двумерный вектор

Пытаюсь организовать двумерное 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 шт):

Автор решения: MBo

FFTW работает с массивом или с указателем на непрерывную область данных. Организация массива описана в документации (в частности, массив должен быть чуть больше, чем произведение размерностей)

Однако строки двумерного вектора хранятся в разных областях памяти, поэтому при своей работе FFTW попадает в чужие области памяти - вот и нарушение доступа.

Используйте одномерный вектор, либо при использовании двумерного вектора делайте раздельные одномерные Фурье по строкам и по столбцам - для второй части FFTW использовать не получится без перепаковки данных.

Можно использовать свою реализацию FFT с любой, какой захочется, организацией входных данных, если скорость не так уж важна.

→ Ссылка