c++ - 是否可以为 fftw 使用共享内存?

标签 c++ arrays pointers memory-management 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-fftw 的输入数组引用两个单独的二维数组?

最佳答案

如果我没理解错的话,你想要两个独立的 vector 对象:

vector<fftw_complex> V1, V2;

并将各自的内容组合成另一个

vector<fftw_complex> V;

没有任何复制。这是不可能的,因为V1V2一起占用的内存是不连续的。但是,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 的输入,即使它适合,结果也不感觉, 因为您正在向它提供一系列内存地址而不是您的数据。

关于c++ - 是否可以为 fftw 使用共享内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18885188/

相关文章:

c++ - 取消引用一个指针,然后获取取消引用的地址

c++ - 从文件中读取输入并存储到二维数组中

c++ - 使用 "constexpr"将字符串文字用于模板参数

javascript - 合并 Material-UI 中的主题配置设置

arrays - 用整数 1 或 2 填充固定大小的数组以求和 X

JAVA将数据存储到outputBuffer数组中,当它满时将其写入文件

objective-c - 为什么我不用 * 声明 NSInteger

pointers - 如何将 lParam 转换为多个结构?

c++ - 如何在函数外部访问函数中局部变量的值?

c++ - 使用动态参数创建线程