2013-02-24 25 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))