You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将std::vector<complex<double>>转换为FFT所需的complex<double>[N]数组

核心解决思路

C++ 中 std::vector 的元素是连续存储的,其 data() 方法会返回指向内部存储数组的指针,可以直接匹配 FFT 函数要求的数组入参,不需要额外做数组转换。同时你原代码中构造复数向量的逻辑可以简化,优化后的完整实现如下:

优化后代码

// 原有前置代码不变
void FFT(Complex f[], Complex ftilde[], int log2N);
vector<double> amplitudes;
WavReader("../Projects/Project4/input.wav", amplitudes);
size_t size = amplitudes.size();                        
const int new_size = resize(size); // 取最近的2的幂次
int log2N = log2(new_size);
using Complex = complex<double>;

// 简化复数向量构造逻辑,不需要单独创建虚部数组
vector<Complex> cvec(new_size);
for (size_t i = 0; i < size; ++i) {
    cvec[i] = Complex(amplitudes[i], 0.0);
}
// 振幅resize补的0对应复数默认就是(0,0),无需额外处理

// 构造FFT输出向量
vector<Complex> ftilde(new_size);
// 直接传入vector的data()指针即可,不需要额外定义栈上数组
FFT(cvec.data(), ftilde.data(), log2N);

注意事项

  • 你原代码中写的 Complex f[N] 属于变长数组(VLA),不是标准C++支持的语法,仅部分编译器提供扩展支持,可移植性很差,不推荐使用
  • 如果确实需要把数据复制到栈数组中(仅当N是编译期常量时合法),可以用std::copy拷贝:
    // 仅N为编译期常量时可用
    Complex f[N];
    std::copy(cvec.begin(), cvec.end(), f);
    

内容的提问来源于stack exchange,提问作者meso96

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:36:04