用C计算二维数组内的平均值

时间:2016-12-24 16:24:18

标签: c arrays

我需要制作一个计算数组内部平均值的代码。

用户输入大小和2D数组。对于此2D数组中的每个数字,程序应计算上方和左侧数字的平均值。 之后,需要打印一个新的数组,其中将存储平均值而不是计算平均值的数字。

例如,对于size-3和array-

1 2 3
4 5 6
7 8 9

结果将是:

1   1.5  2
2.5  3  3.667
4    4.5 5

这是我到目前为止所尝试的

    int main()
{
    int size, i = 0,j = 0,r=0,c=0;
    double array[N][N] = {{0},{0}},sum[N][N]= {{0},{0}};
    scanf("%d",&size);
        for (i=0; i<size ;i++)
        {
            for (j=0; j<size ;j++)
            {scanf("%lf",&array[i][j]);
                }}
   for (i=0;i<size;i++)
    {   for(j=0;j<size;j++)
        {
                for(r = 0;r<i;r++)
                    {for (c = 0;c<j;c++)
                            sum[r][c] += array[i][j];

                            }

        }

        sum[r][c] =(sum[r][c])/((i+1)+(j+1));
}
    for (r=0; r<size; r++){
        for (c=0; c<size; c++)
            printf("%.2f ",sum[r][c]);
            printf("\n");
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

您可以简单地垂直,水平累积,并除以元素数量:

memcpy(sum, array, sizeof(sum)); // copy array into sum

for (i=1;i<size;i++) { // vertical accumulation
    for(j=0;j<size;j++) {
        sum[i][j] += sum[i - 1][j];
    }
}

for(j=1;j<size;j++) { // horizontal accumulation
    for (i=0;i<size;i++)
        sum[i][j] += sum[i][j - 1];
    }

for (i=0;i<size;i++) { // divide by the number of elements
    for(j=0;j<size;j++) {
        sum[i][j] /= ((i+1)*(j+1));
    }
}

可以减少循环次数,但我们需要选择正确的顺序来遍历元素。

MATLAB中的等效代码是:

cumsum(cumsum(array), 2) ./ cumsum(cumsum(ones(size(array, 1))), 2)

答案 1 :(得分:0)

我会使用一个运行总和,然后计算使用的元素数量。然后很容易计算平均值。

尝试这样的事情:

   double current_sum = 0;
   int current_count = 0;
   for (i=0;i<size;i++)
   {   for(j=0;j<size;j++)
        {
            ++current_count;
            current_sum += array[i][j];
            sum[i][j] = current_sum / current_count;
        }
    }
相关问题