首页 > 其他分享 >matlab 静态变量&全局变量

matlab 静态变量&全局变量

时间:2023-02-22 14:46:06浏览次数:52  
标签:Function 变量 静态 matlab 全局变量 Data Store

https://blog.csdn.net/weixin_36084686/article/details/115830515

 

 

Matlab/Simulink中的静态变量和全局变量

1、静态变量(persistent)

1)Matlab中使用静态变量

2、全局变量(global)

1)Matlab中使用全局变量

2)Simulink中使用全局变量

(1)使用 Data Store Memory 模块存储数据

(2)使用 Simulink.Signal 对象存储数据

1、静态变量(persistent)

1)Matlab中使用静态变量

在函数中声明的变量,当函数调用完之后就会释放。如果想保留这个变量的值(供该函数下一次调用),可以把这个变量声明为静态变量。

静态变量只能在function里声明,且只有这个function才能认识它(main函数也不行,被遮蔽无法使用)。静态变量不能在声明的时候赋值,x声明后是[],就是一个空的array。声明后需初始化,注意不能直接用persistent x=0;而是用isempty(x)判断x是否已经赋值。

function y=persistentTest()

persistent x;

if isempty(x)

x=0;

end

x = x + 1;

在命令窗中多次运行如下命令验证是否静态变量创建正确.若x未赋值,则赋值为0,输出结果为1;若x已经赋值,则使用已赋的值进行+1运算。

y = persistentTest

之后调用一次y=persistenTest;结果y=1,再调用一次y=persistenTest;结果y=2。就是说x记录了每次调用function后的结果。

释放静态变量的方式主要是用clear命令。

如果在定义静态变量的子函数内部进行释放,则使用(clear+‘变量名’)即可,与清除普通变量方法一致。

function y=persistentTest(u)

persistent x;

if u ~= 1 && isempty(x)

x=0;

end

x = x + 1;

if u == 1

clear x;

y = [];

else

y = x;

end

如果在主函数中释放静态变量,则使用(clear+‘子函数名’),指定清除某一子函数内定义的所有静态变量。

使用(clear+‘Function’)清除所有的静态变量。

main()

{

clear persistentTest; % 主函数内部释放func内所有静态变量

clear Function; % 释放所有的静态变量

}

Simulink中MATLABfunction中静态变量的使用方式与上述一致。

代码生成不支持在MATLABfunction中使用clear x,可使用状态值(u)的变化来进行静态变量的初始化。

2、全局变量(global)

1)Matlab中使用全局变量

如果想让某个函数中定义的变量能够被其他函数调用,需要用到全局变量。注意,在这两个函数中 都要用global修饰这个变量。如:

function t1

global x;

x=0;

function t2

global x;

y=x

en

2)Simulink中使用全局变量

(1)使用 Data Store Memory 模块存储数据

本部分主要转载自无敌石头哥,稍作修改,原文借鉴MATLAB help 文档,采用2016a版本,亲测2018b版本与此一致。

Matlab Function中使用全局变量的步骤如下:

在Simulink中新建.mdl(或.slx)文件,假设名为“TestGlobal.slx”,将Matlab Function,拖入新建文件中;

双击Matlab Function,进入MATLAB Function Block Editor,在此文本中声明所需用到全局变量(假设为变量名 A)形如 global A;

例如:

function y = fcn

%#codegen

global A;

A = A+1;

y = A;

此处应该注意,当双击Matlab Function,进入MATLAB Function Block Editor后,工具栏中有个“Edit Data"的按键,下步将用到,不太起眼,应当注意,如下图所示:

71f00063caa54ff2521c0a35106eecb9.png

3. 在MATLAB Function Block Editor(进入方式就是双击Matlab Function模块)中,点击工具栏中的“Edit Data”,此时,将显示“Ports and Data Manager”窗口,如下图,或者在ModelExplore中打开也可以。

d9204962e26aec964f15cc4ce42fa0cb.png

点击图中左上角的蓝线标记的“Add Data”按钮,左侧面版中将出现变量“Data”,点击该变量,在右侧修改其名字为全局变量的名字A;点击Scope下拉菜单,将Input修改为“Data Store Memory”;点击右下角“Apply”后关闭该对话框;

4. 在Simulink Library Browser中,点击左侧Simulink–Signal Routing右侧面版将出现Data Store Memory模块,将其拽入至窗口中,双击该Data Store Memory模块,Main标签页修改变量名字为全局变量名,Signal Attributes中设置初值,Data Type(数据类型)以及Signal Type(该项不可以设置为auto)即可,本处设置初值为1,Data Type为int8,Signal type设置为real;同样点击右下角Apply,关闭该窗口。如下图:9271214edc9bbe79836f12badc84d3d9.png

如果 Data Store Memory 模块在顶层系统中,则模型中任意位置的 Data Store Read 和 Data Store Write 模块都可以访问该数据存储。

如果 Data Store Memory 模块在子系统中,则位于同一子系统或模型层次结构中该子系统下面的任何子系统中的 Data Store Read 和 Data Store Write 模块都可以访问该数据存储。

Data Store Read 或 Data Store Write 模块不能访问位于包含 Model 模块的模型中或引用模型中的 Data Store Memory 模块。不要在 For Each 子系统中包含 Data Store Memory 模块。

要从数据存储获取正确的结果,必须确保数据存储按照预期的顺序进行读取和写入。

最后一步用示波器显示结果,整体效果如下图:

b608c7bb4d00751fdf21f46d7685670e.png

ddbf72adc530f10e8fabb6bbda824034.pngMATLAB Function 模块每次执行时都会读取存储在 A 中的全局数据的初始值,并更新 A 的值。

(2)使用 Simulink.Signal 对象存储数据

 

标签:Function,变量,静态,matlab,全局变量,Data,Store
From: https://www.cnblogs.com/focus-z/p/17144277.html

相关文章

  • 手动配置ipv6地址和静态路由
    转发地址:https://www.cnblogs.com/waw/p/16321917.html1.手动配置ipv6地址1.修改配置文件,eth0换成自己的网口名称1vim/etc/sysconfig/network-scripts/ifcfg-eth0......
  • Python、MATLAB股票投资:ARIMA模型最优的选股、投资组合方案与预测
    全文链接:http://tecdat.cn/?p=31651原文出处:拓端数据部落公众号分析师:XingmingXu基于当前统计的股票数据选择最优的选股方案和投资组合方案,以及预测股票价格未来一段时......
  • 【matlab注释中出现乱码】
    原因:MATLAB2017a之前的默认的中文编码格式是GBK,而之后的版本的中文默认编码格式是UTF-8。所以如果用MATLAB2017a之后的版本打开之前版本写的代码,或者用matlab2017a之前的......
  • m基于高阶累积量和信号子空间的信噪比估计方法的matlab仿真
    1.算法描述随着信息技术的飞速发展,信息战逐渐成为战争的一个重要方式。因此,掌握战场的信息控制权是赢得战争的重要因素。在信息战中,为了干扰和破坏对方的通信系统,首先需要......
  • 基于EM算法的参数辨识和分类识别算法matlab仿真
    1.算法描述EM(Expectation-Maximum)算法也称期望最大化算法,曾入选“数据挖掘十大算法”中,可见EM算法在机器学习、数据挖掘中的影响力。EM算法是最常见的隐变量估计方法,在机器......
  • 基于matlab的AES加解密算法仿真
    1.算法描述AES算法在对明文加密的时候,并不是把整个明文一股脑的加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit。这些明文块经过AES加密器复......
  • FreeMarker模板引擎的使用、实现静态化页面
    (目录)freemarker页面静态化技术1.1freemarker介绍FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码......
  • 基于matlab的AES加解密算法仿真
    1.算法描述        AES算法在对明文加密的时候,并不是把整个明文一股脑的加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit。这些明文......
  • 基于EM算法的参数辨识和分类识别算法matlab仿真
    1.算法描述       EM(Expectation-Maximum)算法也称期望最大化算法,曾入选“数据挖掘十大算法”中,可见EM算法在机器学习、数据挖掘中的影响力。EM算法是最常见的隐变......
  • m基于高阶累积量和信号子空间的信噪比估计方法的matlab仿真
    1.算法描述       随着信息技术的飞速发展,信息战逐渐成为战争的一个重要方式。因此,掌握战场的信息控制权是赢得战争的重要因素。在信息战中,为了干扰和破坏对方的通......