如何采用数组的移动平均值

时间:2010-08-03 16:11:02

标签: c

有人可以帮助我解决这个问题,因为我花时间绕过它而没有取得任何进展。 我有一个大小为3O的数据。

  1. 我想取数组的前五个元素,找到它们的平均值。将值存储在另一个数组中
  2. 然后移动到数组的第二个元素,从他们找到5个后续元素的平均值。存储数组中的值,如上所述。
  3. 然后编织到第3个元素,做同样的事情直到最后一个元素,在这种情况下为30。

    float tabdata[] = {1,2,3,4,...,30};
    char *store;
    float sum;
    
    for(int j=0;j<tabdata[30-1];j++)
       sum += tabdata[j];
    if (j=5)
    {
       float mean= sum/5;
       store[j]=mean;
       sum=0;
       for(i=j;i>tabdata[30-1];i++)
           sum +=tabdata[i];
    
  4. if(j = 5)     ---     ----     ....请帮助完成这个循环。

4 个答案:

答案 0 :(得分:1)

只需添加下一个元素的1/5,并在每个步骤中减去当前窗口中第一个元素的1/5。您唯一需要担心的是浮点精度。

答案 1 :(得分:1)

你可以随时修正总和:

#include <stdlib.h>
#include <stdio.h>

int main()
{
    float tabdata[] = {1,1.5,1.8, 2, 3, 4, 5,6,7,8,9,10,11,12,13,14,15,161,7,18,19,20,21,30};
    float* result;
    float sum;
    int count = sizeof(tabdata)/sizeof(tabdata[0]);
    int i;

    result = (float *)malloc((count - 4) * sizeof(float));
    /* Initialise with the first five elements */
    for (i=0;i<5;i++)
    {
        sum += tabdata[i];
    }
    result[0] = sum / 5.0;

    for (i=5;i<count;i++)
    {
        sum -= tabdata[i-5];
        sum += tabdata[i];
        result[i-4] = sum / 5.0;
    }

    for (i=0;i<count-4;i++)
    {
        printf("%f\t%f\n",tabdata[i],result[i]);
    }
    for (;i<count;i++)
    {
        printf("%f\n",tabdata[i]);
    }

    free(result);
}

答案 2 :(得分:0)

我认为您可能想要使用的是模数运算符(%),它将为您提供其余的除法。你会得到这样的东西:

if ((j+1) % 5 == 0)
{
   float mean= sum/5;
   store[j/5]=mean;
   sum=0;
}

这样,在每5次迭代中,代码将被执行。

答案 3 :(得分:0)

尚未对此进行测试但应该有效:

float tabdata[] = {1, 2, 3, ..., 30};
float *result;
float sum;
int count = sizeof(tabdata)/sizeof(tabdata[0]);

result = (float *)malloc((count - 4) * sizeof(float));
for (int j = 0; j < count - 5; j++)  {
   sum = 0;
   for (int k = j; k < j + 5; k++)  {
     sum += tabdata[k];
   }
   result[j] = sum / 5;
}

// ...
free(result);