打印

求一个中位数的算法

[复制链接]
1516|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中

使用特权

评论回复
5
cjseng| | 2017-11-11 17:19 | 只看该作者
采样进来一个数据,就计算一下平均值,然后把采样值与平均值比较,保留与平均值误差最小的那个,这样都用不到64字节。

使用特权

评论回复
6
linqing171| | 2017-11-11 20:40 | 只看该作者
cjseng 发表于 2017-11-11 17:19
采样进来一个数据,就计算一下平均值,然后把采样值与平均值比较,保留与平均值误差最小的那个,这样都用不 ...

前49个都是202;
中间49个33;
然后2个101;
就这个测试的例子,你的算法结果是对的。
但是如果还是这100个测试结果,只是那两个101出现在最前面,你的算法出来的数就变了。
无可否认在很多情况下平均值比中位数要准,但是就算法本事,要求的就是中位数。

使用特权

评论回复
7
linqing171| | 2017-11-11 20:51 | 只看该作者
100个结果,只保留前面52个,后面48个不再保存,(也可以不用记录丢弃的个数)。
1 前52次采样,存入数组,并排序。
2 第52~100次采样,插入数组,插入后仍然是有序的,如果在52之后,直接丢弃,(记录丢弃的个数)。
3 第50和51个就是中位数。

不知道是否有高手能有办法能用更少的缓冲区。

使用特权

评论回复
8
linqing171| | 2017-11-11 20:59 | 只看该作者
就最常见的正态分布而言,中位数的距估计的置信度远远没有平均值的距估计的置信度高。
像有限带宽内的热噪声等均是正态分布。按照大数定理平均值的方差为单次采样方差的  1/sqrt(N), 明显准确于中位数。
在特殊情况下必须使用中位数的,一般采样需要是奇数次,你的100次是不是偶数次?

如果两次采样之间完全是随机的,11次中位数的11次中位数,虽然比100次的中位数要差一些,但是也是个节省资源的办法。

使用特权

评论回复
9
finastic| | 2017-11-12 17:54 | 只看该作者
外扩一个大容量ram,先把数据写到ram里,然后读出来求中位数

使用特权

评论回复
10
zhangxiyi5277| | 2017-11-12 18:32 | 只看该作者
我记得这个帖子不是有大师回复过吗,,为毛帖子没有了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

51

帖子

5

粉丝