matlab 编程之全局变量(global)和永久变量(persistent)

一、global

官方解释:

 help global
 global Define global variable.
    global X Y Z defines X, Y, and Z as global in scope.
 
    Ordinarily, each MATLAB function has its
    own local variables, which are separate from those of other functions,
    and from those of the base workspace.  However, if several functions, 
    and possibly the base workspace, all declare a particular name as 
    global, then they all share a single copy of that variable.  Any 
    assignment to that variable, in any function, is available to all the 
    other functions declaring it global.
 
    If the global variable doesn't exist the first time you issue
    the global statement, it will be initialized to the empty matrix.
 
    If a variable with the same name as the global variable already exists
    in the current workspace, MATLAB issues a warning and changes the
    value of that variable to match the global.
 
    Stylistically, global variables often have long names with all
    capital letters, but this is not required.

1、简单说:

       用matlab写代码时,如果有多个.m文件,且之间存在相互调用关系;每个.m文件中的变量,都为局部变量,都有自己的工作区域/Workspace,当函数调用结束之后,其变量的声明周期也就结束了(记住,变量的声明周期随着子函数的结束而结束);

如果定义了全局变量/global,则需要注意几点:

1、在每一个子函数/.m文件中,都需要先声明,然后再进行操作;

2、global/全局变量,只占一个workspace,即在某一个地方修改,同时在变量存在的地方全部修改;

3、定义多个global/全局变量方式为: global var1 var2 var3 ……;

4、去掉/消除某一个或多个全局变量方式为:clear var1 var2 var3……;

2、优缺点:

(1) 优点

传递大数据的参数:
      如果通过函数传参数的方式的话,系统会浪费过多的时间在复制数据的时间上,如果采用global的方式共享数据的话代码的效率会大大提高

过多的常量需要传递
       如果每个量都作为函数函数的参数传递的话,代码参数列表就很长,如果采用global的话代码的可读性提高,函数调用也方便。

(2) 缺点

      在多数情况下,使用全局变量不是值得推荐的做法,因为会导致模块之间存在强耦合,并且由于各模块的访问顺序问题,可能导致一些难以预料的情况。

示例:

function global_plot()
global X
X=0:0.1:2*pi;
plot_sin(2)
plot_cos(2)
function plot_sin(a)
global X
y=a*sin(X);
figure
plot(X,y)

function plot_cos(a)
global X   %使用全局变量X时,也要用global定义
X=-pi:0,1:pi; %全局变量被修改
y=a*cos(X);
figure
plot(X,y)

结果;

二、persistent 永久变量

1、解释: 局部静态变量

      和global变量很像,和global不同的是,persistent只被定义persistent的函数所知晓/访问,其他函数无法访问或改变它的值。当m文件被从内存中清除或m文件改变时,persistent变量才会被清除。

如果persistent变量中第一次使用时未进行初始化赋值,则初始化为空矩阵。

如果workspace中已经有同名变量,则声明persistent变量会出错。

 示例:

% 脚本文件: 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

子函数:

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

示例:

 

参考

matlab 全局变量的使用举例

Matlab中的保留字:global和persistent

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

  • 16
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值