私は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;
}