是否可以将共享内存用于 FFTW
is that possible to use shared memory for fftw?
我有一个用傅里叶变换实现的数值计算问题。我正在使用 fftw 来实现 FFT,但被 FFT 处理的信号很奇怪。一半的信号来自一个阵列,另一半来自其他阵列。在当前代码中,我只是复制数据
#include <iostream>
#include <vector>
#include <complex>
#include <fftw3.h>
using namespace std;
void main(void)
{
std::vector< std::complex<double> > V1(4);
std::vector< std::complex<double> > V2(4);
std::vector< std::complex<double> > V(8);
for (int i=0; i<4; i++) V[i] = V1[i] = std::complex<double>(i, i);
for (int i=0; i<4; i++) V[i+4] = V2[i] = std::complex<double>(i+4, i+4);
fftw_complex* in = reinterpret_cast<fftw_complex*>(&V[0]);
fftw_plan plan = fftw_plan_dft_1d(8, in, in, FFTW_FORWARD, FFTW_MEASURE);
fftw_execute(plan);
}
这段代码效果很好。但是我希望让大数组引用 V1 和 V2 而不是复制数据。我尝试以下代码,但它不起作用,它说输入数组是**(双指针?
std::vector< std::complex<double> > V1(4);
std::vector< std::complex<double> > V2(4);
fftw_complex *in[8];
for (int i=0; i<4; i++) in[i] = reinterpret_cast<fftw_complex*>(&V1[i]);
for (int i=0; i<4; i++) in[i+4] = reinterpret_cast<fftw_complex*>(&V2[i]);
for (int i=0; i<4; i++) V1[i] = std::complex<double>(i, i);
for (int i=0; i<4; i++) V2[i] = std::complex<double>(i+4, i+4);
fftw_plan plan = fftw_plan_dft_1d(8, in, in, FFTW_FORWARD, FFTW_MEASURE);
fftw_execute(plan);
无论如何,这是将"引用"数组作为 fftw 的输入吗?2d数组会发生什么,是否可以让2d-fftw的输入数组引用两个单独的2d数组?
如果我理解正确,您想采用两个单独的矢量对象:
vector<fftw_complex> V1, V2;
并将它们各自的内容组合成另一个
vector<fftw_complex> V;
没有任何复制。这是不可能的,因为V1
和V2
一起占用的内存不是连续的。然而,V
占用的内存(与任何vector
一样)必须是连续的。如果你想避免在你给出的示例中复制,你可以通过使用指针来实现,如下所示:
void main(void)
{
std::complex<double>* V1;
std::complex<double>* V2;
std::vector< std::complex<double> > V(8);
V1=&V[0];V2=&V[4];
for (int i=0; i<4; i++) V1[i] = std::complex<double>(i, i);
for (int i=0; i<4; i++) V2[i] = std::complex<double>(i+4, i+4);
fftw_complex* in = reinterpret_cast<fftw_complex*>(&V[0]);
fftw_plan plan = fftw_plan_dft_1d(8, in, in, FFTW_FORWARD, FFTW_MEASURE);
fftw_execute(plan);
}
当然,这在您的程序中可能是可行的,也可能是不可行的。您的第二个代码段有一个主要问题:
fftw_complex *in[8];
定义一个由 8 个指向复数的指针组成的数组,而不是一个由 8 个复数组成的数组,因此它不适合作为fftw_plan_dft_1d
的输入,即使它这样做了,结果也毫无意义,因为你给它提供一系列内存地址而不是你的数据。
相关文章:
- 开放 CV 中的动态内存分配,用于视频处理
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 基于浅树的数据结构的内存分配器,用于频繁分配和解除分配
- 将 mmap 内存用于开销非常低的循环缓冲区
- 将基本类型数组中的内存重新用于不同(但仍然是基本)类型的数组合法吗
- C++将shared_ptr用于连续分配的内存
- std::array与C样式数组用于连续内存
- 指针可以用于访问内存中的任何任意区域吗?
- 本地分配的内存是否可以用于将来使用?
- 在 C++ 中,用于将大型 2D 数组转换为 1D 数组的内存分配
- 适用于 std::unique_ptr 的内存高效自定义删除器?
- 内存用于在函数内创建对象?
- 组织从内存读取的数据的最佳方法(用于调试)c++
- MATLAB API用于使用MatgetDir的C例外:Matrix :: Serialize ::在内存位置内置
- 字符串编码用于内存优化
- 用于创建 HDF5 数据集的 4 维 c++ 数组的动态内存分配
- 用于小未对齐数据的快速内存
- mbed 内存池 - 它可用于非平凡类吗?
- 是否可以将共享内存用于 FFTW
- 哪个内存用于全局定义的变量