向前推一个阵列,使其从150开始?

时间:2012-11-10 20:40:30

标签: c# arrays for-loop zedgraph

我有这个功能,它是SMA(简单移动平均线)。数组中的结果我在ZedGraph中显示为图形,现在它将从0到1956开始。我希望图形从frameSize / 2开始,在这种情况下示例它将是300/2所以150因此图形应该从150开始到2016年。

我不想让图表增长我的意思是数组应保持长度为1956我只是希望它从一开始就被150个索引推送,所以它将从索引150而不是0开始。

所以这是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 = 0所以结果是在图像here中。

绿色的是来自此功能的SMA。绿色从150开始,但在1956年结束,它应该在2106结束。当我将它从150开始移动时,我希望整个图形以150为单位移动,因此它将从150开始,到2106结束。红色图应该保持不变

我该怎么做?

现在,因为它在图像中,图形从右边缘结束了300.

这是函数,因为它现在改变了行:double [] avgPoints = new double [data.Length - frameSize + 1];这就是原创的,所以我现在把它改成了这个。 函数将frameSize作为3,将数据作为[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;

        }

2 个答案:

答案 0 :(得分:2)

不可能*某些语言,如pascal允许这样做,但不允许使用c#。

为什么不直接减去偏移量150:

sum += data[index - 150];

*虽然数组不可能,但您可以使用实现索引属性的自定义对象来实现效果。

private int[] _array;

public int this[int index]
{
  get{ return _array[index - 150]; }
}

答案 1 :(得分:1)

您确定:

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

不应该是:

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

然后计算移动平均线的函数应该从反向填充到计数器+填充,而不是从计数器到计数器+ frameSize。

要调试此类问题,通常可以尝试使用哪个更小的数据集,您可以手动计算预期结果,看看您的算法是否符合您的期望。我不相信你的算法必须计算你认为它在这里计算的东西。尝试使用10个数据元素和3的窗口大小,看看你是否得到了你期望的结果。

注意,第一个代码行实际上包含2个逻辑错误,其中一个错误在您尝试代码第二行之前不一定明显。出于说明目的,保留错误