我需要制作一个计算数组内部平均值的代码。
用户输入大小和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;
}
答案 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;
}
}