用C實(shí)現(xiàn):均值計(jì)算的兩種算法
時間:2020-09-10 00:18:52
手機(jī)看文章
掃描二維碼
隨時隨地手機(jī)看文章
[導(dǎo)讀][導(dǎo)讀] 在嵌入式產(chǎn)品開發(fā)中,有時會需要利用一些數(shù)學(xué)統(tǒng)計(jì)的一些知識,并利用代碼的方式實(shí)施在產(chǎn)品的應(yīng)用中。有人會說均值有啥好聊的,不就是加起來除一下嘛?不妨來讀一讀。 本文目的不是數(shù)學(xué),而在于分享如何進(jìn)行工程應(yīng)用實(shí)現(xiàn)。 什么是均值? 對于離散數(shù)據(jù)集
[導(dǎo)讀] 在嵌入式產(chǎn)品開發(fā)中,有時會需要利用一些數(shù)學(xué)統(tǒng)計(jì)的一些知識,并利用代碼的方式實(shí)施在產(chǎn)品的應(yīng)用中。有人會說均值有啥好聊的,不就是加起來除一下嘛?不妨來讀一讀。
什么是均值?
-
樣本均值(sample mean):某類隨機(jī)變量有限樣本的算術(shù)平均值。 -
總體均值(population mean):從隨機(jī)變量概率分布的角度對隨機(jī)變量趨勢的度量,所以從這個角度而言,下面的公式正是描述了這個概念:
大數(shù)定律指出樣本數(shù)量越大,樣本均值越接近總體均值
如何計(jì)算均值?
直接法
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;
}
-
在樣本窗未滿時,按實(shí)際傳入樣本大小遞推。 -
在樣本窗滿后,按實(shí)際傳入樣本大小遞推,并復(fù)位索引。
實(shí)例分析如何遠(yuǎn)離漫天飛舞的全局變量
由static來談?wù)勀K封裝
測試一下
#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,
總結(jié)一下
-END-
本文授權(quán)轉(zhuǎn)載自嵌入式客棧,作者:逸珺
推薦閱讀
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!