matlab 利用persistent关键字 存储持久变量

数学知识:

标准差体现随机变量取值与其期望值的偏差。标准差的值较大,则表明该随机变量的取值与其期望值的偏差较大

反之,则表明此偏差较小。

函数功能:

函数必须能够接受一次输入值并记录对应的已输入数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