1

私はSMA(単純移動平均)であるこの機能を持っています。配列の結果はZedGraphでグラフとして表示され、0から1956まで開始されます。この場合の例では300/2なので、グラフは150から開始する必要があります。 2016年まで。

グラフを大きくしたくないのですが、配列の長さは1956のままにする必要があります。つまり、最初から150のインデックスでプッシュして、0ではなくインデックス150から開始するようにします。

つまり、これはSMA関数です。

private static double[] smaDoubles(int frameSize, int[] data)
{
    int padding = frameSize / 2;
    double sum = 0;
    double[] avgPoints = new double[(padding + data.Length) - frameSize + 1];

    for (int counter = padding; counter <= data.Length - frameSize; counter++)
    {
        int innerLoopCounter = 0;
        int index = counter;
        while (innerLoopCounter < frameSize)
        {
            sum = sum + data[index];

            innerLoopCounter += 1;

            index += 1;

        }

        avgPoints[counter] = sum / frameSize;

        sum = 0;

    }

    return avgPoints;

}

forループではcounter=counter = 0になる前のパディングなので、その結果はここの画像にあります。

緑のものは、この関数からのSMAです。緑は150から始まり、1956で終わり、2106で終わるはずです。150から始めるように移動すると、グラフ全体を1単位として150ずつ移動して、150から始まり、2106で終わるようにします。グラフはすべて同じままである必要があります

どうすればいいですか?

これで、画像のように、グラフは右端から300で終わります。

これは、現在の関数です。次の行を変更しました。double [] avgPoints = new double [data.Length --frameSize + 1]; これがオリジナルだったので、今はこれに変更しました。そして、関数はframeSizeを3として、dataを[10]として取得し、同じ例外を取得します。

private static double[] smaDoubles(int frameSize, int[] data)
        {
            int padding = frameSize / 2;
            double sum = 0;
            double[] avgPoints = new double[data.Length - frameSize + 1];

            for (int counter = padding; counter <= data.Length - padding; counter++)//for (int counter = padding; counter <= data.Length - frameSize; counter++)
            {
                int innerLoopCounter = 0;
                int index = counter;
                while (innerLoopCounter < frameSize)
                {
                   // if (index < data.Length)
                    sum = sum + data[index];

                    innerLoopCounter += 1;

                    index += 1;

                }

                avgPoints[counter] = sum / frameSize;

                sum = 0;

            }

            return avgPoints;

        }
4

2 に答える 2

2

不可能*pascalなどの一部の言語ではこれが許可されていますが、c#では許可されていません。

オフセット150を差し引いてみませんか。

sum += data[index - 150];

*配列では不可能ですが、インデックス付きプロパティを実装するカスタムオブジェクトを使用して効果を実現できます。

private int[] _array;

public int this[int index]
{
  get{ return _array[index - 150]; }
}
于 2012-11-10T22:50:44.627 に答える
1

本気ですか:

for (int counter = padding; counter <= data.Length - frameSize; counter++)

すべきではない:

for (int counter = padding; counter <= data.Length - padding; counter++)

そして、移動平均を計算する関数は、カウンターからカウンター+ frameSizeではなく、カウンター-パディングからカウンター+パディングに移動する必要があります。

このタイプの問題をデバッグするには、期待される結果を手動で計算し、アルゴリズムが期待に一致するかどうかを確認できる、はるかに小さなデータセットを試してみると役立つことがよくあります。あなたのアルゴリズムが、ここで計算していると思うものを必ずしも計算しているとは思いません。10個のデータ要素と3個のウィンドウサイズで試して、期待どおりの結果が得られるかどうかを確認してください。

最初のコード行には実際には2つの論理エラーが含まれていることに注意してください。そのうちの1つは、コードの2行目を試すまで必ずしも明らかではありません。エラーは説明のために保存されています

于 2012-11-10T21:15:53.107 に答える