Конвертировать 2D вектор в FFTW_Complex - PullRequest
0 голосов
/ 11 ноября 2019

В моей программе у меня есть 2D Vector как (vector<vector<double>> Data(ROWS, vector<double>(COLS));), затем я реализую FFTW, чтобы взять FFT из моего вектора с:

fftw_complex in[ROWS][COLS], out[ROWS][COLS];
fftw_plan g;


g = fftw_plan_dft_2d(ROWS, COLS, *in, *out, FFTW_FORWARD, FFTW_MEASURE);

Как я могу конвертировать мой *От 1008 * до fftw_complex in[ROWS][COLS] для функции ввода fftw_plan_dft_2d.

1 Ответ

2 голосов
/ 11 ноября 2019

Элементы std::vector<std::vector<T>> не являются смежными в памяти, тогда как элементы S[rows][cols] являются смежными. Для преобразования между ними вы должны копировать (и преобразовывать, если типы T и S различны) элементы строка за строкой. Общее решение:

template<typename T, typename S, class Op, std::size_t rows, std::size_t cols>
void transform_vec_vec_to_mat(const std::vector<std::vector<T>>& from, Op op, S (&to)[rows][cols]) {
    assert(from.size() == rows);
    for (std::size_t row = 0; row < rows; ++row) {
        assert(from[row].size() == cols);
        std::transform(from[row].begin(), from[row].end(), to[row], op);
    }
}

std::vector<std::vector<double>> data;
std::complex<double> in[rows][cols];

const auto double_to_complex = [](double d) { return std::complex<double>{d, 0}; };
transform_vec_vec_to_mat(data, double_to_complex, in);

Имейте в виду, что реальный ввод может рассматриваться как особый случай для экономии вычислительного времени и пространства. См. официальную документацию для получения более подробной информации.

...