2013-03-15 105 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

嗯似乎沒有什麼東西在低水平。

無論如何爲你答案。