Как взять скользящее среднее из массива - PullRequest
0 голосов
/ 03 августа 2010

Может кто-нибудь, пожалуйста, помогите мне в этом вопросе, поскольку я потратил время, обходя его, не делая никаких успехов.У меня есть данные в массиве размером, скажем, 30.

  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];
    

if (j = 5) --- ---- .... нужна помощь, чтобы завершить этот цикл, пожалуйста.

Ответы [ 4 ]

1 голос
/ 03 августа 2010

Вы можете исправить сумму на ходу:

#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);
}
1 голос
/ 03 августа 2010

Просто добавьте 1/5 следующего элемента и вычитайте 1/5 первого элемента в текущем окне на каждом шаге. Единственное, о чем вам нужно беспокоиться, это точность с плавающей запятой.

0 голосов
/ 03 августа 2010

Не проверял это, но должно работать:

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);
0 голосов
/ 03 августа 2010

Я думаю, что вы, возможно, захотите использовать это оператор модуля (%), который даст вам остаток от деления.Вы получите что-то вроде этого:

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

Таким образом, при каждых 5 итерациях код будет выполняться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...