我已经给出了这个等式来计算信号的总能量:
Ex= ∑ n|x[n]|2
对我来说,建议您将每个块对齐,然后得到整个块的总和。我想知道我编写的代码/算法是否对于这个等式是准确的,并且我已经以最有效的方式完成了它。
double totalEnergy(vector<double> data, const int rows, const int cols)
{
vector<double> temp;
double energy = 0;
for(int i=0; (i < 2); i++)
{
for(int j=0; (j < 2); j++)
{
temp.push_back( (data[i*2+j]*data[i*2+j]) );
}
}
energy = accumulate (temp.begin(), temp.begin()+(rows*cols), 0);
return energy;
}
int main(int argc, char *argv[]) {
vector<double> data;
data.push_back(4);
data.push_back(4);
data.push_back(4);
data.push_back(4);
totalEnergy(data, 2, 2);
}
结果:64
任何帮助/建议将不胜感激:)!
答案 0 :(得分:2)
这当然不是执行此计算的最有效方法,尽管我认为实现几乎是正确的:但n
的乘法不知何故丢失了。由于我无法看到总和索引和界限是什么,我不打算解决这个问题,但我会重现实现的结果,只是“更好”。有两点可以改进:
std::vector<T>
需要分配不是廉价操作的内存。作为第一个近似值,我会就地转换输入向量,然后累加结果:
double square(double value) {
return value * value;
}
double totalEnergy(std::vector<double> data) {
std::transform(data.begin(), data.end(), data.begin(), &square);
return std::accumulate (data.begin(), data.end(), 0);
}
该功能仍可复制数据并对其进行修改。我不喜欢这个。奇怪的是,你实现的操作基本上是矢量与其自身的内积,即,这产生相同的结果,而不创建额外的矢量:
double totalEnergy(std::vector<double> const& data) {
return std::inner_product(data.begin(), data.end(), data.begin(), 0);
}
假设这实现了正确的公式(尽管我仍然怀疑原始公式中的n
),这可能要快得多。它似乎也更简洁......