将二维矢量转换为 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]
的元素是连续的。要在它们之间进行转换,您必须逐行复制(和转换,如果类型 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);
请记住,可以将实际输入视为一种特殊情况,以节省计算时间和 space。有关详细信息,请参阅 the official documentation。
在我的程序中,我有 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]
的元素是连续的。要在它们之间进行转换,您必须逐行复制(和转换,如果类型 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);
请记住,可以将实际输入视为一种特殊情况,以节省计算时间和 space。有关详细信息,请参阅 the official documentation。