gpt4 book ai didi

c++ - 信号的总能量

转载 作者:行者123 更新时间:2023-11-30 04:24:41 28 4
gpt4 key购买 nike

我得到了这个方程来计算信号的总能量:

Ex= ∑ n|x[n]|2 

这对我来说建议您将每个 block 平方,然后得到整个 block 的总和。我想知道我编写的代码/算法对于这个等式是否准确,我是否以最有效的方式完成了它。

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

任何帮助/建议将不胜感激:)!

最佳答案

这当然不是进行此计算的最有效方法,尽管我认为实现几乎是正确的:乘以 n不过,不知何故迷路了。因为我看不到总和索引和边界是什么,所以我不打算解决这个问题,但我会重现实现的结果,只是“更好”。有两点明显可以改进:

  1. 该代码没有使用位于特定列或行中的任何信息。也就是说,它也可以将输入视为一个平面数组,其大小实际上可以从输入 vector 的大小中获知。
  2. 该函数使用两个临时 vector (一个传递给函数,一个在函数内部)。创建 std::vector<T>需要分配内存,这不是一个廉价的操作。

作为第一个近似值,我将就地转换输入 vector ,然后累加结果:

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);
}

该函数仍然复制数据并修改它。我不喜欢这个。奇怪的是,您实现的操作基本上是 vector 与自身的内积,即,这会产生相同的结果,而无需创建额外的 vector :

double totalEnergy(std::vector<double> const& data) {
return std::inner_product(data.begin(), data.end(), data.begin(), 0);
}

假设这实现了正确的公式(尽管我仍然怀疑原始公式中的 n),这可能要快得多。看起来也更简洁了...

关于c++ - 信号的总能量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12548447/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com