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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM