對於離散資料集,算術平均值也稱為期望值或簡稱為平均值,是離散資料集合的中心值。假設有這樣的資料序列:
,其均值由下面的式子計算:
對,你說的沒錯就是加起來求平均。有盆友或許會問,為什麼均值有的地方寫的是
,而這裡寫成
,這其實是有緣由的:
弄這樣兩個概念有什麼必要呢?總體均值反應的是事務的總體規律,實際研究中,往往很難得到所有的資料,比如產品的某項指標規律,如果每乙個產品都去測,代價可能極其高昂,實際往往是對產品進行抽樣檢測。(公式中多寫了個x)
大數定律指出樣本數量越大,樣本均值越接近總體均值如此一來這就有實用意義了。均值除了上面這種算術平均值之外,還有幾何平均值、諧波均值、功率均值、加權均值、截斷均值、函式泛化均值等,有興趣的可以去了解一下。這裡主要討論對於嵌入式電子系統程式設計中,樣本均值的計算方法以及c**。分享直接法和遞推法計算均值,重點介紹遞推法。
按照公式定義,加和求平均。這個編**很容易:
float mean(float *psample,int size)return (sum/size);
}
該方法簡單直接,但是缺點是在記憶體比較小的微控制器系統中如需要計算大樣本集的場合,就捉襟見肘了。比如幾萬樣本時,記憶體可能就不夠了!
因為樣本均值計算公式如下:
那麼前個樣本的均值為:
不難得出:
從而這樣就可以編**了:
float recursive_mean(float xn,int size)else
last_mean = mean;return mean;
}
這個**很容易理解:函式內靜態變數不推薦使用,但這裡函式使用了內部靜態變數,為什麼使用靜態變數呢?因為所實現的需求對外部不可見,這種需求本身的作用域就在函式本體內部。這樣寫個人理解會更好一些。關於static的用法,前面寫過兩篇文章,有興趣的可以去點進去看看:
在嵌入式應用中,如果所需要統計的樣本非常大時,這種演算法將非常有實用價值,只需要極小的記憶體開銷。
尤其在一些感測器測量應用中,該方法非常有價值。
#include #include #include float mean(float *psample,int size)return (sum/size);
}float recursive_mean(float xn,int size)else
last_mean = mean;return mean;
}#define n (1000)#define sample_size (100)int main(int argc, char *ar**)printf("\n\n");int j=0;for(int i=0;i for(j=0;j printf("\n");
j = 0;for(int i=0;i for(j=0;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-
推薦閱讀
c語言記憶體洩露很嚴重,如何應對?
編譯c語言程式,使用 gcc 指令,而c++程式則推薦使用 g++指令!
c語言:優雅的字串函式庫
在c 語言中,請一定記得初始化區域性變數!
嵌入式程式設計是否應該用c++替代c語言
c 實現rsa演算法 RSA演算法實現過程
rsa演算法是實現非對稱加密的一種演算法,其用到很多有關數論的內容,在此我們不多討論。而將目光聚焦於演算法的實現過程。rsa過程 第二步 計算n a b 61 53 3233 第三步 計算 a 1 b 1 60 52 3120 第四步 選擇與3120互質的乙個數e 17,這個e也就是我們的公鑰,需要...
C均值聚類演算法(Python實現)
class pattern x 0 y 0def init self,x,y self.x x self.y y defdis a,b return a.x b.x a.x b.x a.y b.y a.y b.y 0.5eps 0.00001 maxn 1000050 inf 40000000000...
RSA演算法實現
設計說明 rsa演算法為一種非對稱密碼演算法,選取兩個互異大素數p,q,計算n pq,f p 1 q 1 選取不同於q,p的另一素數e並計算在模f下的乘法逆元d,若明文為m,即可根據加密演算法c me mod n進行加密編碼,解密時使用m cd mod n即可。e也稱為加密指數,d被稱為解密指數。以...