1

我已经给出了这个方程来计算信号的总能量:

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

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

4

1 回答 1

2

尽管我认为实现几乎是正确的,但这肯定不是进行此计算的最有效方法:尽管乘以n某种方式丢失了。由于我看不到总和索引和界限是什么,我不打算解决这个问题,但我会重现实现的结果,只是“更好”。有两点明显可以改进:

  1. 该代码不使用位于特定列或行中的任何用途。也就是说,它也可以将输入视为一个平面数组,其大小实际上可以从输入向量的大小中得知。
  2. 该函数使用两个临时向量(一个传递给函数,一个在函数内部)。创建一个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原始公式中的 ),这可能要快得多。它似乎也更简洁......

于 2012-09-22T23:37:23.397 回答