Matlab实现基本工作空间和函数之间数据的相互调用

 

原文地址:http://www.ilovematlab.cn/thread-65655-1-1.html

http://blog.sina.com.cn/s/blog_61cc0fa40100t2zb.html

原文:https://blog.csdn.net/xiaoxiaonc/article/details/7725393 

晚上一段时间纠结了一个nc的问题,有关matlab里S函数中的global全局变量的使用问题,刚开始我很怀疑它的意义何在,使用方法如下:

       比如,我现在想在命令窗口中改变S函数里这样的全局变量,首先在S函数中相应位置(比如在mdloutputs中用到了该变量,即定义下global  variable)要先定义了一个global全局变量,然后在命令窗口中给这样一个变量赋予特定值之后,必须也应声明它为global全局变量,这样才能够让两者对接一致,实际上是系统里的一个全局变量。OK!

 

在使用MATLAB时,有时需要在函数M文件中访问基本工作空间中的变量,或者把函数M文件中的数据保存到基本工作空间中。利用MATLAB提供的两个函数:evalin和assignin就可以实现。

evalin:在函数M文件中访问工作空间中的变量

 

[a1, a2, ...] = evalin(ws, expression);


在工作空间ws中执行expression命令或表达式,并将执行的结果保存到变量a1、a2、...中。

 

函数的调用方法如下所示:

 

v = evalin('base', 'var'); %把基本工作空间中的变量var的值赋给局部变量v。

 

v = evalin('base', 'who'); %查询基本工作空间中的变量名称,并把变量名称保存到v数组中

 

举例:调用基本工作空间中的变量来在界面上绘制图形。

 

 

复制内容到剪贴板

代码:


   首先在基本工作空间中产生x和y变量:

>> x=0:pi/50:2*pi;

>>y=sin(x);

然后在函数M文件中调用这些数据来在界面上绘制曲线:

function myfunc

hf=figure('units','normalized','name','evalin example','position',[0.4 0.3 0.4 0.3]);

haxes=axes('parent',hf,'units','normalized','position',[0.1 0.1 0.8 0.8]);

%取得基本工作空间中的变量的值,保存到xdata和ydata中

xdata=evalin('base','x');

ydata=evalin('base','y');

% 在指定的坐标轴中绘图
axes(haxes);

plot(xdata,ydata);

 


  assignin:将函数M文件中的变量的值传给指定的工作空间中的变量

assignin(ws, 'var', val);

 

将变量val的值赋给工作空间ws中的变量var,如果变量var在工作空间中不存在,则创建该变量。

 

例如:

 

在上述myfunc函数的末尾添加如下语句,即可以在基本工作空间中产生新的变量valueX和valueY,并把函数中的xdata和ydata变量的值赋给valueX和valueY:

 

 

复制内容到剪贴板

代码:


assignin('base','valueX',xdata);

assignin('base','valueY',ydata);

 

变量相关的

MATLAB存储变量在一块内存区域中,该区域称为基本工作空间。脚本文件或命令行创建的变量都存在基本工作空间中。函数不使用基本工作空间,第个函数都有自己的函数空间。

变量有三种基本类型:

1.局部变量

每个函数都有自己的局部变量,这些变量只能在定义它的函数内部使用。当函数运行时,局部变量保存在函数的工作空间中,一旦函数退出,这些局部变量将不复存在。

脚本(没有输入输出参数,由一系列MATLAB命令组成的M文件)没有单独的工作空间,只能共享调用者的工作空间。当从命令行调用,脚本变量存在基本工作空间中;当从函数调用,脚本变量存在函数空间中。

2.全局变量

在函数或基本工作空间内,用global声明的变量为全局变量。例如声明a为全局变量:

>>global a

声明了全局变量的函数或基本工作空间,共享该全局变量,都可以给它曲赋值。

如果函数的子函数也要使用全局变量,也必须用global声明。

3.永久变量

永久变量用persistent声明,只能在M文件函数中定义和使用,只允许声明它的函数存取。当声明它的函数退出时,MATLAB不会从内存中清除它,例如声明a为永久变量:

>>persistent a

原创毕业设计完工贴出来和大家分享一下吧-metro_simulation.rar 我的毕业设计是做一个地铁列车运行过程的仿真系统。当然,不是很复杂。在simulink里面建立模型,然后用GUI对其中变量进行赋值,并通过GUI中的一段函数对制动点进行试凑,最后显示出列车的速度-路程曲线,行驶总路程和时间。 ------------------------------------------- 现将GUI中所调用的功能及其实现方法整理如下: 1、点击按钮,切换GUI。这个现实起来很简单,只要在按扭的callback函数里写上run; close;即可。 2、把GUI中edit框中的数值赋给simulink中对应的变量。这个问题一开始困扰了我好一段时间,看了很多例子都不行,有人说用set_param,但我用了之后总是会报错说变量没有定义。其实,只需要用等号对变量名进行赋值即可。例如:simulink中某个变量为M,edit框的确Tag为name,那么相应的代码就是M=str2double);这里的str2double是将字符串转变为double型的双精度数。调用simulink前写上options = simset;再进行调用sim; 3、从excel中读取数据,并将其赋给对应的edit框。这个在math大哥的视频里已经有详细解析了,这里就不缀述了。 4、将GUI中的参数保存进excel文件中,这个与读取过程类似,不过用的函数是uiputfile和xlswrite,具体的到matlab帮助里看一下就可以了,里面写得非常清楚。 5、将最后的仿真结果绘制出来。这个实现起来相对比较麻烦。首先在simulink里要添加"to workspace"模块(注意save format一定要选择Array)。然后在调用simulink仿真的语句后面,用assignin函数将"to workspace"输出的数据保存在workspace中的向量中,例如assignin; result是输出的结果,k1是保存的向量名。在调用k1进行画图的时候,需要用evalin函数将k1从工作空间中读取出来,如k2=evalin。 如果输出的结果是最终的一个数,而非一个数组,则可以用result来获取,这里的t是仿真时间长度,step为仿真步长。 ---------------------- 我用到的GUI主要部分就是这些,希望能对大家有些帮助。GUI入手的确比较困难,但只要多看几个例子,问题就会迎仞而解。ilovematlab论坛的确给我们提供了一个良好的平台,从这里学到了很多有用的东西。 ---------------------------------- ---------------------------------- 附件中是我的源程序,运行时先从preface开始。 1.jpg 2.jpg 3.jpg 4.jpg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值