数学知识:
标准差体现随机变量取值与其期望值的偏差。标准差的值较大,则表明该随机变量的取值与其期望值的偏差较大
反之,则表明此偏差较小。
函数功能:
函数必须能够接受一次输入值并记录对应的已输入数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 ',ave, std); end