2010-08-03 55 views
0

有人可以幫助我解決這個問題,因爲我花了時間繞過它而沒有任何進展。 我有一個數組大小爲3O的數據。如何採取數組的移動平均值

  1. 我想取數組的前五個元素,找到它們的平均值。將值存儲在另一個數組中
  2. 然後移動到數組的第二個元素,從中找出5個連續元素的平均值。如上所述存儲數組中的值。
  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]; 
    

如果(J = 5) --- ---- ....需要幫助來完成這個循環請。

+0

對於初學者我假定你的意思是'如果(j == 5)而不是你在那裏的分配操作。 – torak 2010-08-03 16:22:05

回答

1

只需添加下一個元素的1/5,並在每一步中減去當前窗口中第一個元素的1/5。唯一需要擔心的是浮點精度。

0

我認爲你可能想要使用的是模數運算符(%),它會給你除法的其餘部分。你會得到這樣的東西:

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

這樣,在每5次迭代,代碼將被執行。

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); 
+1

in(int k = j; k <5; k ++)循環條件應該是k Vladimir 2010-08-03 16:31:07

+0

同樣高效 - 計算每個點的總和,當它可以保持更新的總和時。 – 2010-08-03 16:41:22

+0

儘管它效率低下,但它確實可以避免由於增加1/5值而後減去相同值的1/5的效應可能無法抵消而導致精度損失的問題。 – 2010-08-03 17:21:04

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); 
}