用C实现:均值计算的两种算法
时间:2020-09-10 00:18:52
手机看文章
扫描二维码
随时随地手机看文章
[导读][导读] 在嵌入式产品开发中,有时会需要利用一些数学统计的一些知识,并利用代码的方式实施在产品的应用中。有人会说均值有啥好聊的,不就是加起来除一下嘛?不妨来读一读。 本文目的不是数学,而在于分享如何进行工程应用实现。 什么是均值? 对于离散数据集
[导读] 在嵌入式产品开发中,有时会需要利用一些数学统计的一些知识,并利用代码的方式实施在产品的应用中。有人会说均值有啥好聊的,不就是加起来除一下嘛?不妨来读一读。
什么是均值?
-
样本均值(sample mean):某类随机变量有限样本的算术平均值。 -
总体均值(population mean):从随机变量概率分布的角度对随机变量趋势的度量,所以从这个角度而言,下面的公式正是描述了这个概念:
大数定律指出样本数量越大,样本均值越接近总体均值
如何计算均值?
直接法
float mean(float *pSample,int size)
{
if(pSample== NULL || size<= 0)
return NAN;
float sum = 0;
for( int i= 0;i<size;i++)
{
sum += *pSample;
pSample++;
}
return (sum/size);
}
递推法
float recursive_mean(float xn,int size)
{
static int index = 0;
static float last_mean = 0.0f;
float mean = 0.0f;
if(index<size -1)
{
index++;
mean = last_mean+(xn-last_mean)/index;
}
else
{
mean = last_mean+(xn-last_mean)/size;
index = 0;
last_mean = 0.0f;
}
last_mean = mean;
return mean;
}
-
在样本窗未满时,按实际传入样本大小递推。 -
在样本窗满后,按实际传入样本大小递推,并复位索引。
实例分析如何远离漫天飞舞的全局变量
由static来谈谈模块封装
测试一下
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
float mean(float *pSample,int size)
{
if(pSample== NULL || size<= 0)
return NAN;
float sum = 0;
for( int i= 0;i<size;i++)
{
sum += *pSample;
pSample++;
}
return (sum/size);
}
float recursive_mean(float xn,int size)
{
static int index = 0;
static float last_mean = 0.0f;
float mean = 0.0f;
if(index<size -1)
{
index++;
mean = last_mean+(xn-last_mean)/index;
}
else
{
mean = last_mean+(xn-last_mean)/size;
index = 0;
last_mean = 0.0f;
}
last_mean = mean;
return mean;
}
#define N (1000)
#define SAMPLE_SIZE (100)
int main(int argc, char *argv[])
{
float sim[N];
float out[N/SAMPLE_SIZE];
for( int i= 0;i<N;i++)
{
sim[i]=i* 5+rand()% 10;
}
printf( "\n\n");
int j= 0;
for( int i= 0;i<N;i=i+SAMPLE_SIZE)
{
out[j] = mean(&sim[i],SAMPLE_SIZE);
j++;
}
for(j= 0;j<N/SAMPLE_SIZE;j++)
{
printf( "%.2f,",out[j]);
}
printf( "\n");
j = 0;
for( int i= 0;i<N;i++)
{
out[j]=recursive_mean(sim[i],SAMPLE_SIZE);
if((i+ 1)%SAMPLE_SIZE== 0)
j++;
}
for(j= 0;j<N/SAMPLE_SIZE;j++)
{
printf( "%.2f,",out[j]);
}
printf( "\n");
return 0;
}
252.14, 752.38, 1251.85, 1751.82, 2252.57, 2752.25, 3251.78, 3751.58, 4252.06, 4752.02,
252.14, 752.38, 1251.85, 1751.82, 2252.57, 2752.25, 3251.78, 3751.58, 4252.06, 4752.02,
总结一下
-END-
本文授权转载自嵌入式客栈,作者:逸珺
推荐阅读
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!