将二维矢量转换为 FFTW_Complex

Convert 2D Vector to FFTW_Complex

在我的程序中,我有 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);

如何将我的 vector 转换为 fftw_complex in[ROWS][COLS] 以用于输入 fftw_plan_dft_2d 函数。

std::vector<std::vector<T>> 的元素在内存中不连续,而 S[rows][cols] 的元素是连续的。要在它们之间进行转换,您必须逐行复制(和转换,如果类型 TS 不同)元素。通用解决方案:

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);

请记住,可以将实际输入视为一种特殊情况,以节省计算时间和 space。有关详细信息,请参阅 the official documentation