You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:实现二维数组3x3均值卷积的C程序编写

问题描述

我需要帮助完善我的程序,使其能够计算3x3滑动窗口的平均值并依次处理下一个窗口。目前我编写的代码仅能计算整个矩阵的平均值,现在陷入了困境……

现有代码
#include <stdio.h>
#define ROWS 5
#define COLS 7

int main(void){
    float in_sum = 0;
    float *in_matrix[ROWS][COLS];
    float in_avg;

    float matr[ROWS][COLS]={{1.5, 5, 6, 12, 13, 7, 80},
                            {50, 6.5, 23, 77, 17, 8.5, 28},
                            {43.5, 78, 8, 9, 34.5, 10, 95},
                            {75, 44, 40, 29, 39, 5, 99.5},
                            {18, 86, 68, 92, 10.5, 11, 4}};

    printf("Matrix Input:\n");

        for(int i = 0; i < ROWS; i++){
            for (int j = 0; j < COLS; j++){
                printf("%.2f ", matr[i][j]);
                    if(j==6){
                        printf("\n");
                    }
            }
        }
        printf("\nMatrix Output: \n");
        int j = 0, nr = 3, nc = 3;
        for (int i = 0; i < nr; i++){
            for(j = 0; j < nc; j++){
                in_sum = in_sum + matr[i][j];
            }
        }
        in_avg = in_sum/(ROWS*COLS);
        for (int i=0; i< ROWS; i++){
            for (int j=0; j< COLS; j++){
            printf("%.2f", in_avg);
            }
            printf("\n");
        }
        in_matrix[ROWS][COLS] = &in_sum;
    return 0;
}
修正后的代码及说明

3x3滑动窗口的核心逻辑是:遍历所有合法的窗口起始位置(确保窗口不超出矩阵边界),计算每个窗口内9个元素的平均值。对于5行7列的矩阵,最终输出的结果矩阵为3行5列(5-3+1=3,7-3+1=5)。

#include <stdio.h>
#define ROWS 5
#define COLS 7
#define WINDOW_SIZE 3

int main(void){
    // 原始输入矩阵
    float matr[ROWS][COLS]={{1.5, 5, 6, 12, 13, 7, 80},
                            {50, 6.5, 23, 77, 17, 8.5, 28},
                            {43.5, 78, 8, 9, 34.5, 10, 95},
                            {75, 44, 40, 29, 39, 5, 99.5},
                            {18, 86, 68, 92, 10.5, 11, 4}};

    // 打印原始矩阵
    printf("Matrix Input:\n");
    for(int i = 0; i < ROWS; i++){
        for (int j = 0; j < COLS; j++){
            printf("%.2f ", matr[i][j]);
        }
        printf("\n");
    }

    // 计算并打印滑动窗口平均值
    printf("\nMatrix Output (3x3 sliding window averages):\n");
    // 遍历所有窗口的起始行
    for(int i = 0; i <= ROWS - WINDOW_SIZE; i++){
        // 遍历所有窗口的起始列
        for(int j = 0; j <= COLS - WINDOW_SIZE; j++){
            float sum = 0.0;
            // 累加当前窗口内的所有元素
            for(int x = 0; x < WINDOW_SIZE; x++){
                for(int y = 0; y < WINDOW_SIZE; y++){
                    sum += matr[i + x][j + y];
                }
            }
            // 计算平均值并输出
            float avg = sum / (WINDOW_SIZE * WINDOW_SIZE);
            printf("%.2f ", avg);
        }
        printf("\n");
    }

    return 0;
}

关键修改点

  • 用WINDOW_SIZE宏统一管理窗口大小,后续修改窗口尺寸只需调整该值
  • 外层循环控制窗口的起始位置,确保窗口不会超出矩阵范围
  • 内层循环计算每个窗口内的元素总和,再除以窗口元素总数得到平均值
  • 移除了原代码中无意义的指针数组in_matrix以及错误的平均值计算方式(原代码误将总和除以整个矩阵的元素数)

内容的提问来源于stack exchange,提问作者tabas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:50:34