簡體   English   中英

GNU科學圖書館(GSL)總結

[英]Sums on GNU Scientific Library (GSL)

我在GSL上使用了“均值”功能,事實證明它比我的幼稚實現更為准確。 我還沒有找到“求和”函數,而是使用了“均值” * N,但是我認為如果使用適當的求和函數會更干凈。

我正在對大量數字求和,並且我想知道這樣做是否可以避免實施穩定的求和算法。

提前致謝。

有時使用的一種技巧是使用cblas_ddot函數,並使用一個1的向量來計算數據的點積。 這將有效地計算您的數據總和。

簡短答案:更好的求和方法是Kahan求和算法 這個答案更正表明

“它具有與單純求和相同的算法復雜度;它將大大提高求和的准確性。”,並給出了C ++的實現。

僅當數組元素的大小差異很大或者您確實需要原則上可以加倍的16位精度(稀有情況)時,才需要進行Kahan求和。

因此,在用C編碼kahan sum之前,您應該做一些檢查。 鑒於gsl_stats_mean的GSL實現是

(GSL 1.16源代碼)

  /* Compute the arithmetic mean of a dataset using the recurrence relation 
     mean_(n) = mean(n-1) + (data[n] - mean(n-1))/(n+1)   */

  long double mean = 0;
  size_t i;

  for (i = 0; i < size; i++)
  {
    mean += (data[i * stride] - mean) / (i + 1);
  }

我無法立即看到,如果您的數的確確實在大小上有很大差異(這在高度可變的數和均值之間存在直接的和,而在數量上緩慢地變化),這將避免精度的損失。 一個很好的檢查是在使用朴素的實現/ gsl計算總和/平均值之前對數組進行排序。

編輯1:警告,如果打開優化,則c = (t - sum) - y可以優化為c = 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM