2013-02-24 51 views
0

我試圖計算(在VBA Excel中)具有超過65536個元素的數組的平均值和StDev。是這樣的:平均值,超過65536元的StDev?

米蒂亞= worksheetfunction.Average(陣列()) DesvTip = worksheetfunction.StDev(陣列())

儘管陣列的尺寸小於65536是沒有問題的,但是,當它更大,它給了我一個錯誤!

我知道這個VBA函數不能用於超過65536個數據,所以我怎樣才能在VBA中獲得這個參數?

Apreciate your comments。非常感謝! :))

回答

1

您可以計算平均值和標準偏差,而無需存儲所有值。只需保持總和,總和的平方和點數。您可以有多少個積分,因爲整數個積分可以這樣。

下面是我如何在Java中完成它。隨意嬰兒牀。

package statistics; 

/** 
* Statistics 
* @author Michael 
* @link http://stackoverflow.com/questions/11978667/online-algorithm-for-calculating-standrd-deviation/11978689#11978689 
* @link http://mathworld.wolfram.com/Variance.html 
* @since 8/15/12 7:34 PM 
*/ 
public class Statistics { 

    private int n; 
    private double sum; 
    private double sumsq; 

    public void reset() { 
     this.n = 0; 
     this.sum = 0.0; 
     this.sumsq = 0.0; 
    } 

    public synchronized void addValue(double x) { 
     ++this.n; 
     this.sum += x; 
     this.sumsq += x*x; 
    } 

    public synchronized double calculateMean() { 
     double mean = 0.0; 
     if (this.n > 0) { 
      mean = this.sum/this.n; 
     } 
     return mean; 
    } 

    public synchronized double calculateVariance() { 
     double variance = 0.0; 
     if (this.n > 0) { 
      variance = Math.sqrt(this.sumsq-this.sum*this.sum/this.n)/this.n; 
     } 
     return variance; 
    } 

    public synchronized double calculateStandardDeviation() { 
     double deviation = 0.0; 
     if (this.n > 1) { 
      deviation = Math.sqrt((this.sumsq-this.sum*this.sum/this.n)/(this.n-1)); 
     } 
     return deviation; 
    } 
} 
+0

感謝您的評論。 – Shivoham 2013-02-25 14:46:51

0

使用以下算法,如果數據被存儲在一個陣列x(1 to N, 1 to 1),其中N

sum = 0# : sumsq = 0# 
for i=1 to N 
    sum = sum + x(i,1) 
    sumsq = sumsq + x(i,1)^2 
next i 

average = sum/N 
stddev = Sqr(sumsq/N^2 - sum^2/N^3) 

數據點的數量:注意: 爲了填補該陣列使用符號

Dim r as Range, x() as Variant 
Set r = Range("A1").Resize(N,1) 
x = r.Value 
0

感謝您的評論。最後我們做了類似的事情。我希望對於有同樣問題的人來說這將是有用的。我們的代碼:

sum = 0 
sumq = 0 

For i = 0 To ((2 * N) - 1) 
    sum = sum + h_normal(i) 
Next i 

media = sum/(2 * N) 

For j = 0 To ((2 * N) - 1) 
    sumsq = sumsq + (h_normal(j) - media)^2 
Next j 

desviaci(h - 1) = Math.Sqr(sumsq/((2 * N) - 1))