• 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
    ',ave, std);
    end
  • 相关阅读:
    五层原理体系结构的简单分析
    Simple Factory 简单工厂模式(静态工厂)
    css一个图片包含多个图片|网站侧栏导航
    百度地图、高德地图的数据从哪里得到的?
    浏览器开发
    开发一款浏览器内核需要学习哪些方面的知识?
    使用PowerDesigner进行数据库建模入门
    How to create a search engine
    合并两个有序数组
    STL中的algorithm
  • 原文地址:https://www.cnblogs.com/shuqingstudy/p/4864610.html
Copyright © 2020-2023  润新知