如何解决实现逆离散傅里叶变换时创建vector出现的‘no matching function for call’错误
解决IDFT实现中的类型不匹配错误与逻辑问题
嘿,这个错误的根源很清晰——你试图用复数类型去初始化一个float类型的vector,这两种类型完全不兼容,编译器找不到对应的构造函数,所以才抛出了那个匹配错误。
错误原因拆解
你写的这行代码:
std::vector<float> vect_x(Xf.size(),static_cast<std::complex<float>>(0, 0));
std::vector<float>的构造函数要求第二个参数是float类型,但你传入了std::complex<float>,类型不匹配直接触发编译错误。而且从IDFT的计算需求来看,中间步骤本来就需要复数运算,所以vect_x根本不应该是float类型的vector。
修复后的完整代码
我不仅帮你修正了类型问题,还调整了原代码里不符合IDFT公式的逻辑(原循环里用vect_x[k]自乘累加,初始值是0的话结果永远是0,完全不对):
#include <vector> #include <complex> #include <cmath> // 先定义PI常量,避免未定义问题 constexpr float PI = std::acos(-1.f); void IDFT(std::vector<float> &x, const std::vector<std::complex<float>> &Xf) { const size_t N = Xf.size(); // 中间计算用复数vector,初始化为复数值0 std::vector<std::complex<float>> vect_x(N, std::complex<float>(0, 0)); for (size_t k = 0; k < N; ++k) { for (size_t m = 0; m < N; ++m) { // IDFT的指数项是正的(和DFT的负指数相反) std::complex<float> expval(0, 2 * PI * static_cast<float>(k * m) / N); // 按照IDFT公式累加Xf[m]与指数项的乘积 vect_x[k] += Xf[m] * std::exp(expval); } // 别忘了IDFT必须的归一化因子:除以N vect_x[k] /= N; // 将复数结果的实部赋值给输出vector(若输入是实信号的DFT,虚部会趋近于0) x[k] = vect_x[k].real(); } // 确保输出vector的大小和输入DFT的长度一致 x.resize(N); }
关键修复点说明
- 类型修正:把
vect_x改为std::vector<std::complex<float>>,适配复数运算需求,初始化复数值0也完全合法了。 - 逻辑修正:原代码的累加逻辑完全错误,现在按照IDFT公式
x[k] = (1/N)Σ(Xf[m] * e^(j2πkm/N))实现,用输入的Xf[m]参与计算。 - 归一化处理:添加了
1/N的归一化因子,否则输出结果的幅度会是正确值的N倍。 - 类型安全:用
size_t作为循环变量类型,避免unsigned和int的类型警告。
内容的提问来源于stack exchange,提问作者Shukun Xing
相关产品推荐
相关产品推荐

