2013-03-15 107 views
2

我有一个double *数组,其中包含大约10'000个元素,并且必须从中减去平均值。这一定要退出很多。C++从双数组中减去均值

现在,我已经做了退出愚蠢:

double mt = 0; 
for (int i=0; i<n; i++) {mt += array[i];} 
mt /= n; 
for (int i=0; i<n; i++) {array[i] -= mt;} 

借助于此阵:双& n个大数组是数组的大小。我敢肯定有一些花哨的角色可以更快地实现它,我希望你们能够帮助我。

欢呼 麻姑

+0

这将会非常快。您是否尝试过使用最高优化设置和基准进行编译? – NPE 2013-03-15 12:23:19

+3

更快?并行... – qPCR4vir 2013-03-15 12:23:26

+0

我不认为在C++代码方式(也许是处理器方式,如果你在多个内核上并行)做直接的方式会有更好的(更好的更快)。也许在汇编程序中,但必须深入思考 – Jcl 2013-03-15 12:23:41

回答

0

这可以用更短的方式完成,但性能不会明显更好。从<algorithm>使用std::accumulate

double mean = std::accumulate(array, array + n)/double(n); 

什么,但是你可以做的是要记得你第一次计算,然后在接下来的迭代简单地从总和减去(mt * n)(假设你的问题显示出那是什么发生了改变在迭代之间

0

您的解决方案看起来好像没什么问题。

您可以使用std::transform但我确信它不会使它更具可读性。

0

如果你必须经常这样做,那么为什么不只是保持一个运行总数和数组中的项目数呢?

然后计算平均值的总和将是复杂度O(1)。

0

通过保留total_value的活动副本,您可以跳过每次平均值的计算。如果您必须递归地从同一个表本身中减去平均值,则可以使用以下公式并找到总数。

new_total = old_total - n * prev_mean; new_mean = new_total/n;

0

嗯似乎没有什么东西在低水平。

无论如何为你答案。