我有这个功能,它是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;
}
答案 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个逻辑错误,其中一个错误在您尝试代码第二行之前不一定明显。出于说明目的,保留错误