c++ - 快速傅立叶变换:即使标头和 .cpp 文件匹配,也使用模板派生类“未定义引用”错误
问题描述
我正在编写一个快速傅立叶变换算法,该算法使用复向量递归地执行 Cooley Tukey 方法。头文件和 .cpp 文件在参数名称和语法上匹配,但我仍然收到“未定义引用”错误。由于错误中提到了“额外”分配器参数。我认为这可能与为我们的抽象基类和派生的 Cooley-tukey 类使用模板有关。所有问题都来自递归划分输入的 FFF_REC 函数。
Github:https ://github.com/ProgrammerB/Fourier-Transform-Terminal-/blob/master/classes/cooley-tukey.h
我已经尝试将参数更改为引用并将私有成员添加到 cooley-tukey 类中,但我得到了同样的错误。
Cooley-Tukey 类:
template<typename T>
class Cooley_tukey: protected Fourier<T>{
public:
Cooley_tukey();
Cooley_tukey(std::string file_name, double frequency, double,
frequency_step, std::string output_name);
//~Cooley_tukey();
void FFT(const std::vector<T> &index, const std::vector<T> &value);
std::vector<complex<T>> FFT_REC(std::vector<complex<T>> &temp, int
total_time); //recursion function for FFT
private:
int total_time;
};
部分错误:
classes\cooley-tukey.cpp:91:10: error: no matching function for call to
'Cooley_tukey<double>::FFT_REC(std::vector<std::complex<double>,
std::allocator<std::complex<double> > > [(total_time / 2)], int,
std::vector<std::complex<double>, std::allocator<std::complex<double> >
>&)'FFT_REC(odd, total_time/2, result);
FFT-递归函数(错误来源):
template<typename T>
std::vector<complex<T>> Cooley_tukey<T>::FFT_REC(std::vector<complex<T>>& temp, int total_time)
{
// Check if it is split up enough
if (total_time >= 2)
{
// Split even and odds up
std::vector<complex<T>> odd[total_time/2];
std::vector<complex<T>> even[total_time/2];
for (int i = 0; i < total_time / 2; i++)
{
even->at(i) = temp.at(i*2);
odd->at(i) = temp.at(i*2+1);
}
// Split up tasks through FFT recursion method
FFT_REC(even, total_time/2);
FFT_REC(odd, total_time/2);
// DFT portion of FFT - calculates after everything has been split up through FFT_REC
for (int frequency = 0; frequency < total_time / 2; frequency += this->frequency_step)
{
std::complex<T> t = exp(std::complex<T>(0, -2 * M_PI * frequency / total_time)) * odd->at(frequency);
//Result of Cooley-Tukey algorithm:
//*This gives us the frequency values at certain times
temp.at(frequency) = even->at(frequency) + t;
temp.at(total_time / 2 + frequency) = even->at(frequency) - t;
}
}
return temp;
}
template class Cooley_tukey<double>;
解决方案
你正在创建一个向量数组作为even
/odd
而你应该只有一个向量。该错误表明没有采用向量数组的方法。
我假设你的意思是:
// Split even and odds up
std::vector<complex<T>> odd;
std::vector<complex<T>> even;
odd.reserve(total_time/2);
even.reserve(total_time/2);
for (int i = 0; i < total_time / 2; i++)
{
even.push_back(temp.at(i*2));
odd.push_back(temp.at(i*2+1));
}
您还尝试使用at()
将值设置为会导致错误的空向量。向量可能没有分配任何存储空间,如果您尝试使用它们来索引它们,at()
那么当它超出范围时会出现异常。
推荐阅读
- python - 我不知道如何阻止它被打印
- data-binding - 父 NavigationView 的 SwiftUI 更新数据
- excel - 如何获取在一个范围内具有 velue Excel VBA 的最后一行
- php - 通过 Zoho CRM 自定义连接集成 Square API。如何?
- pandas - 绘制数据帧中每个唯一元素的相对频率
- python - Tkinter 两人游戏的组织代码
- python-3.x - Python:递增一的方法返回无
- lua - 在堆栈布局中旋转小部件
- javascript - 如何在 for 循环中选择指定的数据(如 id)以在不同页面中使用这些数据
- java - 将对象转换为 JSON 时出现 Java StackOverflowError 错误