求一个中位数的算法

[复制链接]
1797|9
 楼主| huang1051 发表于 2017-11-10 18:24 | 显示全部楼层 |阅读模式
我用MCU采集数据,每次只可以采到一个数据,我采集100个数据后想知道这100个数据的中位数要怎么弄,但是我MCU的RAM空间只有64个,应该怎么做有没有大神帮帮我.
 楼主| huang1051 发表于 2017-11-10 18:30 | 显示全部楼层
好像是没办法的做的吧
mcu5i51 发表于 2017-11-11 09:32 | 显示全部楼层
如果是在数据在一段中,比如AD的数据,会在一个中心数值上下一段中,可以记录出现的数值和对应的次数
dirtwillfly 发表于 2017-11-11 16:03 来自手机 | 显示全部楼层
如果采集频率不高的话,可以考虑把数据存储在flash中
cjseng 发表于 2017-11-11 17:19 | 显示全部楼层
采样进来一个数据,就计算一下平均值,然后把采样值与平均值比较,保留与平均值误差最小的那个,这样都用不到64字节。
linqing171 发表于 2017-11-11 20:40 | 显示全部楼层
cjseng 发表于 2017-11-11 17:19
采样进来一个数据,就计算一下平均值,然后把采样值与平均值比较,保留与平均值误差最小的那个,这样都用不 ...

前49个都是202;
中间49个33;
然后2个101;
就这个测试的例子,你的算法结果是对的。
但是如果还是这100个测试结果,只是那两个101出现在最前面,你的算法出来的数就变了。
无可否认在很多情况下平均值比中位数要准,但是就算法本事,要求的就是中位数。
linqing171 发表于 2017-11-11 20:51 | 显示全部楼层
100个结果,只保留前面52个,后面48个不再保存,(也可以不用记录丢弃的个数)。
1 前52次采样,存入数组,并排序。
2 第52~100次采样,插入数组,插入后仍然是有序的,如果在52之后,直接丢弃,(记录丢弃的个数)。
3 第50和51个就是中位数。

不知道是否有高手能有办法能用更少的缓冲区。
linqing171 发表于 2017-11-11 20:59 | 显示全部楼层
就最常见的正态分布而言,中位数的距估计的置信度远远没有平均值的距估计的置信度高。
像有限带宽内的热噪声等均是正态分布。按照大数定理平均值的方差为单次采样方差的  1/sqrt(N), 明显准确于中位数。
在特殊情况下必须使用中位数的,一般采样需要是奇数次,你的100次是不是偶数次?

如果两次采样之间完全是随机的,11次中位数的11次中位数,虽然比100次的中位数要差一些,但是也是个节省资源的办法。
finastic 发表于 2017-11-12 17:54 | 显示全部楼层
外扩一个大容量ram,先把数据写到ram里,然后读出来求中位数
zhangxiyi5277 发表于 2017-11-12 18:32 来自手机 | 显示全部楼层
我记得这个帖子不是有大师回复过吗,,为毛帖子没有了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

51

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部