关于Matlab中GUI设计的一些基本问题

最近在做DSP实验时被各种全局变量和静态变量搞得很蛋疼,对于Matlab这个迷之语言也是迷了好久才大致搞清楚了实验中遇到的“玄学”BUG,下面大致总结下实验中遇到的问题:

实验是做一个DTMF信号检测器,大致就是用Matlab搞一个GUI出来,然后能够实现拨打电话时双赢多频信号的产生和检测,是不是很有趣?((⊙o⊙))

一、下面就是实验中遇到的问题:

Matlab中GUI函数的工作原理

在Matlab中构建GUI后,会生成一个.m文件,这个文件是一个函数,形如:

function varargout = Exp5(varargin)
gui_Singleton = 1;

gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @Exp5_OpeningFcn, ...
                   'gui_OutputFcn',  @Exp5_OutputFcn, ...
                   'gui_LayoutFcn',  [], ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
   gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

具体这些东西的分析见于http://blog.csdn.net/yizhou2010/article/details/50379398 此处不当作重点
此处重点要讲的是——总的GUI函数(此处为Exp5)是事件监测机制的,确切的说,类似于JavaScript中的事件监听器,每触发一次事件(例如点击一个元素),总的GUI函数就会运行一次,注意,点击鼠标不单单是触发了对应元素的回调函数(callback),还会导致整个GUI函数重新运行一遍,下面给出如下证明:
在总函数开头插入断点。

《关于Matlab中GUI设计的一些基本问题》 image.png

之后在应用界面随便点击一个按钮,如

《关于Matlab中GUI设计的一些基本问题》 丑的一逼

这时程序便暂停在断点处,
《关于Matlab中GUI设计的一些基本问题》 image.png

这时点击继续运行,便继续运行

《关于Matlab中GUI设计的一些基本问题》 丑如老狗

重复上述行为,和上述情况一致。且若不点击界面,程序就不会中断,表明GUI主函数并不是设置了定时运行功能。

二、Matlab中Global和Persistent的用法

被这两个妖艳jian货搞得好惨。。。
persistent
永久变量

  1. 用persistent函数声明永久变量;
  2. 只能在函数文件中定义和使用,只允许定义它的函数存取;
  3. 当定义函数退出运行时,MATLAB不会清除它,下次调用它将会使用它原先被保留的值;
  4. 只有清除函数或者关闭MATLAB才能从内存中清除它们;
  5. 永久变量的默认初值被设置为“[]”,用户可以自己设置永久变量的初始值;
  6. 最好在函数开始时声明永久变量;

global
正常情况下,每个MATLAB函数都有自己的独立工作区,用以存储其局部变量。使用global声明全局变量的方式可以在不同函数的工作区以及基本工作区(在命令窗口中能够直接访问的工作区)之间共享信息。也就是说,在任何一个工作区中声明了一个全局变量之后,就可以和其它工作区共用一个变量的副本。
全局变量在首次声明之后,如果还没使用,会被初始化为空矩阵。

这里注意一下,把变量设置为persistent后并赋初值,就可以在其他函数中访问到他,并且所有函数都可以访问到上一次修改过的值,即使是触发了新事件。但设置global并赋初值时,虽然其他函数都可以访问到他,但是触发了新事件后,global变量便会重新变为初始值,如果是设置global变量但不赋初值,则触发新事件后,函数仍可以访问到上一次被修改过的值。

    原文作者:yohn
    原文地址: https://www.jianshu.com/p/c9dba2a8fafd
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞