求助:实现二维数组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
相关产品推荐
相关产品推荐

