數學知識:
標准差體現隨機變量取值與其期望值的偏差。標准差的值較大,則表明該隨機變量的取值與其期望值的偏差較大
反之,則表明此偏差較小。
函數功能:
函數必須能夠接受一次輸入值並記錄對應的已輸入數N、sum(xi)、sum(xi^2),用於計算當前的平均值和標准差。
已輸入數N、sum(xi)、sum(xi^2)必須存儲在持久內存中,這樣在每一次調用后,不會消失,最后函數須具備需要時把這些值清零的功能。
1. State the problem
編寫一個程序,計算當前輸入數據的平均數和標准差。函數必須具備需要時計算功能和清零功能
2. Define the inputs and outputs
輸入變量:當輸入字符型“reset”用於已輸入數N、sum(xi)、sum(xi^2)的清零
3.Design the algorithm(偽代碼)
這個函數分為4步:
1)check for a legal number of arguments
2)check for a 'reset',and resets sums if preset,otherwise,add current value to running sums
3)calculate and return runing average and std dev if enough data is available
return zeros if not enough data
4)這些步驟的偽代碼:
檢查輸入的每個數的合法性
if x == 'reset'
n <- 0
sum_x <- 0
sum_x2 <- 0
else
n <- n+1
sum_x <- sum_x +x
sum_x2 <- sum_x2 +x^2
%計算平均值ave和方差std
if n == 0
ave <- 0
std <- 0
else if n==1
ave <-sum_x
std <- 0
else
ave <-sum_x/n
std <-sqrt((n*sum_x2 - sum_x^2)
end
4.Turn the algorithm into MATLAB statements
自定義函數:runstats.m
function [ave, std] = runstats(x) %RUNSTATS 隨時計算一組數的平均值和方差 % 輸入數x必須一次一個,當輸入字符串'reset'時,持久變量清零 % 定義輸入輸出變量 % ave --平均值 % msg --錯誤信息 % n --一組數的個數 % std --方差 % sum_x --一組數的的和 % sum_x2 --一組數的平方和 % x --輸入值 % 版本記錄: % 日期 負責人 版本描述 % ==== ========== ===================== % 2015-10-9 17:43:33 王茂春 源代碼 % 持久變量聲明(重要) persistent n % 輸入數的個數 persistent sum_x % 輸入數的和 persistent sum_x2 % 輸入數的平方和 % 檢查輸入數的合法性 msg = nargchk(1,1,nargin); %最少1個參數,最多一個參數,檢查輸入變量 error(msg); % 如果輸入時'reset',重置 if x == 'reset' n = 0; sum_x = 0; sum_x2 = 0; else n = n + 1; sum_x = sum_x + x; sum_x2 = sum_x2 + x^2; end % 計算平均值和方差 if n == 0 %0輸入 ave = 0; std = 0; elseif n == 1 %1輸入 ave = sum_x; std = 0; else ave = sum_x / n; std = sqrt((n*sum_x2 - sum_x^2) / (n*(n - 1))); end
調用函數test_runstats.m:
% 腳本文件: test_runstats.m % % 程序目的: % 計算輸入一系列數的平均值和方差,(是隨時保存值的) % % 版本記錄: % 日期 負責人 版本描述 % ==== ========== ===================== % 2015-10-9 17:43:33 王茂春 源代碼 % % 定義變量: % array --輸入數組 % ave --平均值 % ii --循環索引 % nvals --輸入數的數量 % std --方差 % 首先清零初始化 [ave std] = runstats('reset'); % 確定輸入數的數量 nvals = input('輸入這一組總數: '); % 獲取輸入值 for ii = 1:nvals % 提示輸入(這種方法:分成兩個語句的學習下。。。) string = ['輸入數值 ' int2str(ii) ': ']; x = input(string); % 調用函數求解(輸出變量是多個) [ave std] = runstats(x); % 顯示運算結果 fprintf('平均值 = %8.4f; 標准差 = %8.4f\n',ave, std); end