1

我有这个函数,它是 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 = padding 之前它是 counter = 0 所以结果在这里的图像中。

绿色的是这个函数的 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;

        }
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 个逻辑错误,其中一个在您尝试代码第二行之前不一定很明显。保留该错误以用于说明目的

于 2012-11-10T21:15:53.107 回答