0

65536 個を超える要素を持つ配列の Average と StDev を (VBA Excel で) 計算しようとしています。このようなもの:

Mitja = worksheetfunction.Average(array()) DesvTip = ワークシート関数.StDev(array())

配列の次元が 65536 より小さい場合は問題ありませんが、大きい場合はエラーになります。

この VBA 関数は 65536 個を超えるデータを処理できないことがわかっています。VBA でこのパラメーターを取得するにはどうすればよいですか?

あなたのコメントに感謝します。どうもありがとう!:))

4

3 に答える 3

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;
    }
}
于 2013-02-24T22:08:04.160 に答える
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
于 2013-02-24T22:41:00.860 に答える
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))
于 2013-02-25T14:50:04.250 に答える