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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:01:22