如何平均数组的子集并将结果存储在另一个数组中?

时间:2011-10-18 01:24:58

标签: c arrays math arduino average

我有一个C数组fftArray[64],其中包含我想要平均并放入另一个数组frequencyBar[8]的值。使用for语句可以很容易地获得整个数组的平均值。

int average, sum = 0;
for (i = 0; i < 64; i++)
{
     sum += fftArray[i];
}
average = sum/64;

但我似乎无法弄清楚如何从fftArray[0]fftArray[8]获取平均值并将其存储在frequencyBar[0]中,fftArray[9]fftArray[16]的平均值{1}}并将其存储在frequencyBar[1]等等。任何人都可以帮我解决这个问题吗?感谢

4 个答案:

答案 0 :(得分:4)

这看起来像是一项家庭作业,所以,不要只给你一个彻头彻尾的答案,我宁愿只指出你正确的方向......

使用嵌套循环(一个在另一个内)。一个循环循环0-7,另一个循环0 - 63.使用较小的循环填充切片平均值。

或者更好的是使用%运算符来查看您何时浏览了8个元素并进行了总计的平均值,然后重置下一组的总数。然后你就会学会如何使用%运算符! :)

[编辑] 好吧,如果不是家庭作业,那么这样的事情...我在5年内没有写过C,所以把它视为伪代码:

//assuming you have a fftArray[64] with data, as per your question
int i,sum,avCounter,total;
int averages[8]; 
for(i=0 , avCounter=0, total=0 ; i<64; ){
    total += fftArray[i];
    if(++i % 8 == 0){   //%gives you the remainder which will be 0 every 8th cycle
      averages[avCounter++] = total / 8
      total = 0;  //reset for next cycle
    }
}

我认为这比嵌套循环更好......但是我不确定,因为%是除了加法处理器更重的除法......但是......我怀疑有人会注意到:)

答案 1 :(得分:2)

int i, j;
for (i = 0; i < 8; i++) {
    int sum = 0;
    for (j = 0; j < 8; j++) {
        sum += fftArray[ 8*i + j ];
    }
    frequencyBar[i] = sum / 8;
}

奖励练习:优化此代码以提高所选平台的速度。

答案 2 :(得分:2)

TF,

免责声明:这段代码不在我的脑海中......它甚至没有编译过,更不用说经过测试了。

// returns the average of array[first..last] inclusive.
int average(int[] array, int first, int last) {
    int sum = 0; 
    for (i = first; i <= last; i++)
        sum += array[i];
    return sum / (last - first + 1); // not sure about the +1
}

那么你要做的是循环遍历frequencyBar数组[0..7]的索引,设置frequencyBar[i] = average(array, first, last); ......棘手的一点是计算firstlast索引...分别尝试i*8(i+1)*8 ......这可能不完全正确,但它会很接近; - )

干杯。基思。


编辑:无聊......等待我的测试结果回来。没有消息是好消息,对吗? ; - )

事实证明,传递length比传递last索引要简单得多。

#include <stdio.h>

int sum(int array[], int first, int length) {
    int sum = 0;
    for (int i = first; i < first+length; i++)
        sum += array[i];
    return sum;
} 

double average(int array[], int first, int length) {
    double total = sum(array, first, length);
#ifdef DEBUG
    printf("DEBUG: [%2d..%2d] %d", first, first+length-1, array[first]);
    for (int i = first+1; i < first+length; i++)
        printf(" + %d", array[i]);
    printf(" = %d / %d = %f\n", (int)total, length, total/length);
#endif
    return total / length;
} 

int main(int argc, char* argv[]) {
    int array[] = {             // average
        1, 2, 3, 4, 5, 1, 2, 3, // 2.625 
        4, 5, 1, 2, 3, 4, 5, 1, // 3.125 
        2, 3, 4, 5, 1, 2, 3, 4, // 3
        5, 1, 2, 3, 4, 5, 1, 2, // 2.875
        3, 4, 5, 1, 2, 3, 4, 5, // 3.375
        1, 2, 3, 4, 5, 1, 2, 3, // 2.625
        4, 5, 1, 2, 3, 4, 5, 1, // 3.125
        2, 3, 4, 5, 1, 2, 3, 4  // 3
    };
    double frequency[8];
    for (int i = 0; i < 8; i++)
        frequency[i] = average(array, i*8, 8);

    for (int i = 0; i < 8; i++)
        printf("%f ", frequency[i]);
    printf("\n");
}

答案 3 :(得分:0)

如果sum的值很大,请注意fftArray没有包围!