5×5矩阵均值与中位数计算及存储问题(MIDE-51)
5×5矩阵均值、中位数计算及存储方案(针对单片机RAM场景)
1. 解决加法溢出问题
5×5共25个8位元素,总和最大为25×255=6375,远超过8位(255)的存储上限,必须用16位变量(如C语言的unsigned int,汇编的寄存器对)存储总和,避免溢出。
2. 定义RAM矩阵(以8051单片机为例)
通过关键字区分内部/外部RAM:
#include <reg51.h> // 外部RAM的5×5矩阵,起始地址设为0x0000 unsigned char xdata ext_matrix[5][5] _at_ 0x0000; // 内部RAM的5×5矩阵,用于存储结果 unsigned char idata int_matrix[5][5];
3. 计算总和与均值
unsigned int sum = 0; unsigned char mean; // 遍历外部矩阵求和 for(int i = 0; i < 5; i++) { for(int j = 0; j < 5; j++) { sum += ext_matrix[i][j]; } } // 整数除法求均值(若需浮点可改用float类型) mean = sum / 25;
4. 计算中位数
中位数需要先排序所有元素,再取中间值(25个元素的第13个,索引为12):
unsigned char temp[25]; unsigned char median; int idx = 0; // 将二维矩阵转成一维数组,方便排序 for(int i = 0; i < 5; i++) { for(int j = 0; j < 5; j++) { temp[idx++] = ext_matrix[i][j]; } } // 冒泡排序(新手易理解,25个元素效率足够) for(int i = 0; i < 24; i++) { for(int j = 0; j < 24 - i; j++) { if(temp[j] > temp[j+1]) { unsigned char swap = temp[j]; temp[j] = temp[j+1]; temp[j+1] = swap; } } } // 取中位数 median = temp[12];
5. 填充内部RAM矩阵
按需求将均值、中位数存入内部矩阵,示例为前13个存均值,后12个存中位数:
idx = 0; for(int i = 0; i < 5; i++) { for(int j = 0; j < 5; j++) { int_matrix[i][j] = (idx < 13) ? mean : median; idx++; } }
核心注意事项
- 若使用汇编语言,需用两个8位寄存器组合(如R2和R3)存储16位总和,加法时处理进位。
- 不同单片机的外部RAM访问方式不同,比如STM32需通过地址映射指针访问,需根据硬件调整代码。
- 排序算法可根据需求替换为选择排序,效率略高于冒泡,但逻辑复杂度相近。
内容的提问来源于stack exchange,提问作者Sowad
相关产品推荐
相关产品推荐

