MATLAB学习总汇与问题解决方案总结 - 图文

更新时间:2024-04-03 16:41:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

MATLAB学习总汇与问题解决方案总结

说明:为了广大matlab爱好者提供便利,总结了matlab论坛里帖子的一些常见问题总结和解决方案. 目录

1、GUI新手之——教你读懂GUI的M文件 ................................................................................... 5 2、GUI程序中改变current directory引起的问题 ......................................................... 10 3、GUI中h0bject和handles 的区别 ......................................................................... 11 4、handles结构中句柄和对象的关联问题............................................................................... 12 5、Matlab利用定时器连续显示图片的问题............................................................................. 14 5-1、GUI中实现在图片任意位置上标注text .............................................................................. 17 5-2、使用edit的另外一种callback ................................................................................... 17 6、MATLAB 如何实现图像的任意裁减? ................................................................................... 17 7、坐标轴标注刻度、网格、文字方向 ................................................................................ 18 8、Matlab中对uitable的操作:调节各列宽度,设定某列是可编辑的 ............ 19 9、将在Matlab下编写的GUI转成独立于Matlab平台的应用程序....... 20 10、要将用Matlab语言编写的函数文件编译成可独立执行的*.exe文件 .. 23 11、matlab GUI程序转换成exe可执行文件 ...................... 26 12、gui生成独立的应用程序的发布问题 .......................... 28 13、GUI控制simulink模块及参数的综合实例! ................... 29 13-1、在axes显示图像后,在图像上单击鼠标时,回调函数的定义规则和使用方法 ..... 30 14、如何在循环中加入waitbar,并在waitbar上添加?取消‘按钮 ................................ 31 15、在matlab中对信号进行FFT变换 ............................................................................ 33 16、动态显示figure中曲线的x-y坐标值的一个函数 ........................................................ 34 17、在GUI界面的打开按钮中,如何对文件进行操作 ............................................................ 37 18、Matlab不同控件之间的数据传递问题 .............................................................................. 39 19、在edit box里输入相关数据后,直接按回车键,不用鼠标点击pushbutton 就可以直接执行 .......................................................................................................................................... 41 19-1 GUI使用editbox输入数据后如何自动清除数据................ 41 20、在GUI中,计算结果怎么用excel来保存到指定的文件夹中 ........ 42 21、如何得到popupmenu选项中最后一个字符串的VALUE值 ............................................ 43 22、回调函数互相调用的问题 ..................................................................................................... 44 22-2string和number相互转换的问题 ................................................................................. 45

1

23、这样的功能的pushbutton的callback怎么写呀,谢谢了....................................... 45 24、GUI中axes使用subplot时的清空及axes大小的固定的解决方法 .. 46 25、退出GUI时如何把全局变量中的值清空? ...................... 48 26、从串口接受数据时,如何把波形绘制到指定的坐标轴上? .............................................. 48 27、两个GUI之间如何传递数据 ................................. 50 28-1 几个有用的帖子 ........................................ 52 28-2、GUI之间互相调用和关闭问题 ............................. 54 29、GUI timer定时器 ....................................... 55 30、如何在循环中加入waitbar ................................................................................................ 56 31、如何连续读入图片!! ......................................................................................................... 57 32、如何把此次输入的值保存为下一次初始化的值 .................................................................. 58 33、Matlab关于解决自动保存gcf的问题 ............................................................................. 58 34-1、在matlab里面如何读取excel里面的数据或者写入数据 ....................................... 60 34-2、在excel中连续输入数据。 ........................................................................................... 61 35、Matlab GUI不同控件之间的数据传递问题 ........................................................... 63 36、怎么统计一个十进制数中\的个数??求助! .............................................................. 64 37、Matlab对listbox里的条目能否一条条单独设置回调函数? ..................................... 65 38、键盘操作:matlab GUI中如何取得从键盘输入的按键的键值 ........................ 67 39、GUI如何响应鼠标事件 ......................................................................................................... 68 40、matlab 截图、图像处理 ..................................................................................................... 71 41、MATLAB GUI中利用定时器制作动画 - [MATLAB] ............... 79 42、MATLAB如何从GUI中返回参数 - [MATLAB] ................... 81 43、MATLAB 中GUI子程序的参数传递 - [MATLAB] ................. 82 44、Matlab保存axes上的图的问题(包括坐标轴) ........................................................... 83 45、Matlab鼠标控制的两个GUI例子(附代码) ..................... 86 46、分享初学的一个GUI例子--新手好好看看(图).............................................. 92 47、axes清除畫面 ..................................................................................................................... 108 48、GUI中调用自己制作的帮助文件 ....................................................................................... 109 49、关于从gui调用simulink .............................................................................................. 109 50、如何将菜单中退出项和窗口关闭的回调函数合并? ........................................................ 112 51、matlab 日历程序 ............................................................................................................... 114 52、如何在GUI里得一个axes实现双Y坐标轴 .................................................................. 116 53、如何实现动态的GUI界面 .................................................................................................. 116 54、关于GUI和simulink参数传递和执行 ......................................................................... 117 55、代码运行时间的计时方法 ................................................................................................... 129 56、如何在GUI指定的axes中再画一个axes .................................................................... 130 57、按下鼠标左键并拖动鼠标时的作图方法............................................................................ 131 58、图像处理相关资料 ............................................................................................................... 132 59、保存axes坐标轴上画的曲线或图形 ................................................................................ 135 60、在GUI中如何打开IE ........................................................................................................ 136 61、gui输入数据,通过rs232传给芯片 ............................................................................. 136 62、Matlab关于gui和excel的问题 ................................................................................. 137 63、matlab 如何显示数学公式 ............................................................................................... 140 64、修改matlab自带的tabdlg的字体和颜色 ................................................................... 143

2

65、求助 Matlab的RGB彩色图合成 ..................................................................................... 143 66、如何删除已绘制的曲线? ................................................................................................... 144 67、总结一下,MATLAB中随机矩阵获得 ................................................................................ 145 68、【原创】GUI设计中背景音乐的定制与关闭 ................................................................... 148 69、Matlab如何改变GRID 网格线的颜色? ........................................................................ 151 71、把plot图上的某些曲线排除在lengend之外,即不用legend标注出来 ............. 152 72、如何连续对矩阵追加数值 ................................................................................................... 153 73、两个等直径圆管的交线 ....................................................................................................... 155 74、Matlab的csvread读取数据的问题 ............................................................................. 156 75、在对数坐标系插值的问题 ................................................................................................... 157 76、实现在原有图像上的部分图像变为白色............................................................................ 157 78、如何实现双击listbox中的条目才表示选中 ................................................................. 158 79、如何删除矩阵中的NaN ....................................................................................................... 159 80、用平行截面法讨论由曲面z=x^2-y^2构成的马鞍面形状。 ........................................ 159 81、如何利用ode45解方程 ..................................................................................................... 160 82、Matlab图片如何批处理?pic变量逐一读取文件夹所有图片名 ................................ 160 83、方程为:exp(-x)=cos(x),用迭代法求出最小的正根,当相对误差<=10e-6时,求根结束。 ........................................................................................................................................ 161 84、通过鼠标点击控制循环 ....................................................................................................... 161 85、图像经连续小波分解后的显示效果图 ............................................................................... 162 85-1、怎样查看图像的属性....................................................................................................... 164 86、想产生如下的矩阵:6行10列,每行都是1 2 3 4 5 6 7 8 9 10。 ................. 164 87、textread读取.txt中数据 ............................................................................................. 164 88、数制之间的转换怎么实现 ................................................................................................... 165 89、matlab读取大数据文件的方法 ........................................................................................ 167 90、从状态空间方程转换为传递函数 ....................................................................................... 169 91、生成0 1 2 3 4 5 6 7 8 随机出现大小为20X20的矩阵! .................................. 169 92、存储绘图过程,并播放视频 ............................................................................................... 170 93、如何同时读入多个文件,并作图? ................................................................................... 170 94、MATLAB GUI编程中几个有用的程序段........................................................................... 172 95、Matlab如何在给定区域随机取点? ................................................................................ 175 96、数据如何导入到workspace中,并执行?在GUI里面,怎么传递处理。 ............... 175 97、matlab下画?心‘的程序。 ............................................................................................... 176 98、点到直线的距离怎么求? ................................................................................................... 176 99、如何绘制正态分布图? ....................................................................................................... 180 100、matlab作图时,如何只保存图像而不显示图像 .......................................................... 180 101、在三维图中只显示x,y轴,不显示z轴 ...................................................................... 181 102、cell array和矩阵的显示 ............................................................................................ 181 103、矩阵形式的转换 ................................................................................................................. 183 104、如何判断鼠标是否在figure内的某一区域? ............................................................. 184 105、一个有用的程序 ................................................................................................................. 184 106、窗口的最大化、最小化、图标、置顶 ............................................................................. 186 107、连续生成文件名的问题 ..................................................................................................... 188 108、编辑框edit中输入公式后的绘图问题.......................................................................... 189

3

109、MATLAB中plot命令绘图微调的几个注记 (转自职业仓库) ................................ 190 110、MATlab 三维图中显示z坐标轴的极大极小值 ............................................................ 198 111、如何一次性清空GUI程序的handles结构中的变量 ................................................. 198 112、Matlab如何给元胞中的每个一维向量前增加同一个数? .......................................... 199 113、用guide生成的不同GUI之间控件的互相操作 .......................................................... 201 114、自定义Matlab figure 工具栏按钮 ........................................................................... 203 115、matlab 有没有按某个小数位数做四舍五入的函数? ................................................. 204 116、有关矩阵中小于某值的数取整的问题 ............................................................................. 204 117、Matlab表面被截后的部分 .............................................................................................. 205 118、如何是imshow显示的图像充满整个figure? ......................................................... 206 119、图像颜色统计直方图 ......................................................................................................... 206 120、Matlab如何将大元胞数组写入到txt文件 ................................................................. 207 121、构造特殊矩阵(右螺线状的) .......................................................................................... 208 122、figure中多坐标轴中曲线的legend标注 ................................................................. 209 123、GUI中鼠标选中并显示曲线的类型及坐标 ..................................................................... 210 124、Matlab中y=1\\x围绕y轴旋转形成的旋转曲面 ....................................................... 213 125、GUI程序一开始以?最大化‘显示的问题 ........................................................................ 214 126、如何实现文本自动转换 ..................................................................................................... 214

4

1、GUI新手之——教你读懂GUI的M文件

GUIDE生成的GUI的M文件控制了你编制的GUI界面的所有属性和行为,或者说外观和对用户操作的响应。比如说按下一个按钮或者选择了一个菜单项之类。M文件包括了运行你整个界面程序所需要的全部代码,包括所有GUI组件的CALLBACKS函数。其实这些callbacks函数算是M文件里的子程序,callback里面就填写你所期望程序做的动作,比如画一个图或者算一个算式。 插入,关于什么是子程序 懂的人跳过^_^

function [avg, med] = newstats(u) % Primary function % NEWSTATS Find mean and median with internal functions. n = length(u); avg = mean(u, n); med = median(u, n);

function a = mean(v, n) % Subfunction % Calculate average. a = sum(v)/n;

function m = median(v, n) % Subfunction % Calculate median. w = sort(v); if rem(n, 2) == 1 m = w((n+1) / 2); else

m = (w(n/2) + w(n/2+1)) / 2; end

以上就是一个大的程序function nestats,它下面另外包含了两个小的function mean和median,这样在大程序的里面就可以以如上的方式调用它们了。子程序的好处在于如果你总是要重复用到一组计算方式的时候,那你就把这组重复计算方式类似以上的方法编写成一个子程序,避免大量重复代码。在M

5

文件里面,会看到最外层,也就是最上面那一一行 function varargout = setfire(varargin)

(setfire是我m文件存的名字)就是那个大程序框,它下面有很多小function 比如什么什么creatFcn或者什么callback之类。看上去那个复杂,其实就跟上面这个一样的道理。只不过是M文件的类似avg = mean(u, n);med = median(u, n);这两句话系统隐藏(就当它是隐藏好了)起来了,它会在你点击鼠标(或者响应操作)时候自动去调用执行一次callback函数。所以你只用管把代码写入响应的函数名下就行了。至于系统为什么会自动调用,我们不用管,我们只用知道,我点击鼠标,我拖动滑竿时,系统会执行哪里的代码。就够了。 一、M文件的数据管理模式

Sharing Data with the Handles Structure :用handles这个东西共享数据

在你运行你的GUI的时候,M文件会自动生成一个叫做handles的东西(准确的说它属于handles 类型的结构体,且取的名字也叫做handles),不用管那么复杂,只用知道你可以从它这里找到GUI的所有数据,比如说控件的信息,菜单信息,axes信息。想象handles就是一个缸了,它里面装载了所有的信息,而且这个缸在各个控件的callback之间传来传去,理所当然那每个控件的callback都可以放入一些想放入的数据,也可以从里面取出任何想要的数据包括别的控件的信息(比如滑竿的当前值,edit text的当前值)和别的控件放进去的数据。

所以,用handles可以达到的目的有两个: a,各个控件的callback的信息交换 (current_data是随便设置的变量名)

handles.current_data = X; 在某控件下的callback写入这一句,就

6

表示你把这个数据放缸里了

guidata(hObject,handles);接着别忘了保存~! 然后在你需要的地方把它从缸里捞出来 X1 = handles.current_data;

b,读取GUI控件的信息,自然也可以设置GUI控件的信息(比如说背景色随着按钮点击而变换之类,或者你想让按钮A点一下,字符B跳一下,也行。) all_choices是随便取的变量名,my_menu是你那个菜单项的TAG名字 all_choices = get(handles.my_menu, 'String'); current_choice = all_choices{get(handles.my_menu, 'Value')};

这样current_choice就得到了用户界面操作中,目录或者菜单的选择结果。 所以,要什么信息,直接用handles.你的对象 就行了。 存什么信息也直接handles.你的对象 就行了。

如果是自己的数据,就.变量名;如果是控件信息,就用get set 二、M-File里的各个函数代表什么意思

在设计面板设计排列好自己需要的各种按钮或者编辑框之后,下一步任务便是添加自己的响应代码。

Opening function 添加在它名下的代码,在GUI开始运行但是还不可见的时候执行。这里的代码一般都是做一些初始化工作的。

Output function 如果有需要,可以向命令行输出数据。(这个函数我没用过,不多说了^_^)

Callbacks 每一次点击按钮或者向输入框输入数据或者拖动滑竿,这些控件名下的callback就会执行一次。

7

函数的输入参数

M-File名下的全部function都会有这两个输入参数

hObject 它代表的是当前的这个控件(也就是你点哪一个按钮或者拖的哪一个滑竿)

handles 它代表的是现在这整一个GUI界面 对这两个变量进行修改后

guidata(hObject, handles); 进行保存,否则修改无效;P 三、Opnning Function

这个函数名下的代码 在界面可见之前执行。其实你也可以在这个函数名下用handles.什么tag 来获得组件的信息。因为在Opnning函数之前,所有的组件就已经生成了,只不过openning函数是把这些组件?打开‘,让它们显示出来。所以你可以在这个函数下面,添加代码,对界面做一些初始化工作。比如,计算一些数据,显示一幅图或者别的什么工作。

function my_gui_OpeningFcn(hObject, eventdata, handles, varargin)

另外两个输入参数eventdata是matlab的保留参数,为以后开发准备的,我们不用管它。varargin 它里面保存了,传进来的命令行。 varargin怎么理解呢? -------------

my_gui('Position', [71.8 44.9 74.8 19.7])

%GUI也是函数,它只不过是有个界面的函数。它的调用,同样是 函数名(输入参数)。

这里就表示GUI在打开时,位置这个属性被设置成了右边那个值。也就是在这个位置打开GUI。Position是你GUI界面的一个属性。(要想知道各个控件

8

有什么属性,在它上面双击就看到了。)所以同样,也可以用这种方式输入其他的初始化命令。

my_gui('路人甲','年十八')

但如果你输入别的,左边那个根本就不是界面的属性名称。这是输入的参数就保存在varargin里面。也就是 vararging{1}='路人甲' vararging{2}='年十八'。

这样也可以达到向调用的GUI传入数据的目的。 四、Output Function

Output function 有输入自然就有输出,顾名思义,这个函数就是用来输出的。

function varargout = my_gui_OutputFcn(hObject, eventdata, handles)

% Get default command line output from handles structure varargout{1} = handles.output;

这个函数不是我们自己编写的,也不是我们负责调用。我们只用知道要传出去的数据,其实是放在vararout这个变量里面的。但是我们在别的控件的callback是叫不到vararout这个变量的,因为你去看这些callback的输入参数里并没有vararout这个变量给它用。所以我们只能间接修改

handles.output这个变量。(当然在后面别忘了添加guidata(hObject, handles);保存修改)

因为默认的output函数里面varargout{1}=handles.output,也就是修改了vararout。

(所以知道了原理,output只是一个名字而已,你也可以用任意别的名字,或者添加更多的输出变量,只要在outputFcn下面添加

9

varargout{2}=handles.第二个变量名 。。。。类似)

guidata(hObject, handles)之后不要立即delete窗口命令,因为这时候outputfcn没有再执行一次,也就是你刚刚修改的output并没有更新到varargin里面去。 所以要么单独设计一个关闭按钮;要么跟uiwait(handles.figure1);uiresume合用。 五、Callbacks回调函数

当你对组件做点击或者别的动作,则自动调用相应的callback。callback的名字取决于你的控件的tag和控件类型以及响应类型。

function print_button_Callback(hObject, eventdata, handles) 2、GUI程序中改变current directory引起的问题

fig和m文件和见下,主要是用来导入数据(用于导入两个文件夹中的txt文件,每个txt有两列,第一列时间,第二列电压),运行后发现只能点击一个pushbutton,当点击第二个时会出现以下错误:

??? Undefined function or method 'fenbianlv1' for input arguments of type 'struct'. Error in ==>

@(hObject,eventdata)fenbianlv1('pushbutton2_Callback',hObject,eventdata,guidata(hObject)) ??? Error while evaluating uicontrol Callback

应该是某个地方设置的问题。pushbutton里面的函数体好像没问题。就算在第二个函数体里面只编写一个很简单的赋值语句也会出现同样的错误,调试发现点击第二个pushbutton时根本没有进入到这个函数体内。好像是点击了一个pushbutton后再点击第二个pushbutton它就找不到这第二个pushbutton的callback函数了。但如果两个pushbutton都编写简单的赋值语句发现没有错误,说明第一个pushbutton的callback函数体代码对第二个

10

pushbutton的callback调用产生了影响,但是是什么地方影响了一直发现不了。 解决办法:

是在pushbutton1和pushbutton2的回调函数里用cd(dataRoute)把matlab的current directory的路径给改了,数据读取完成后,没有恢复到原先的路径,导致程序出错。

读取数据前先保存原先的路径: oldpath=cd;

数据读完后再恢复原先的路径: cd(oldpath);

修改后的程序见实例程序:fenbianlv1. 3、GUI中h0bject和handles 的区别

刚学GUI,举个例子,就是Pop_up Menus吧,他的回调函数是这样的: function=pushbutton1_Callback(hObject, eventdata, handles) 然后我想问的是:Val=get(h0bject,'Value')和

Val=get(handles.pushbutton1,'Value');这两个的值是一样的吗,如果是一样的,那h0bject和handles在使用时有什么区别? 答:

在MATLAB GUI中,数据分两种:GUI data和application data。 两种数据的存取机制是相同的,但是GUI data使用起来比较方便。

每一个GUI 图形界面都维持一个和自己的界面的图形(figure)相联系的一个handles数据结构,这个数据结构中容纳图形界面内所有控件(按钮、列表框、编辑框等)的句柄,相当于一个大的“容器”,里面存放了figure内所有控件的句柄。同时,handles结构也可以被figure内所有控件的回调函

11

数访问,因为回调函数的输入参数中都有handles结构。此外,在控件的回调函数内可以把数据存储到handles结构中。

handles结构数据的取得和存储是通过guidata函数来实现的。 例如:在编辑框edi的回调函数内想获得t编辑框的句柄,hObject可以,也可以用handles.edit,这两个值是一样的,没有区别,只不过获得控件句柄的方式不同而已:hObject是调用回调函数时直接传过来的,

handles.edit是从handles结构中取得的。但是,在控件的CreateFcn函数中如果想访问控件,必须用hObject,而不能用handles.edit,因为这时控件还没被创建,其句柄还没有加入到handles结构中。

各控件的回调函数中,hObject的值是不一样的,分别代表调用回调函数的控件的句柄,而handles结构却是一样的。这种机制便于figure内的不同控件的回调函数内传递数据。

4、handles结构中句柄和对象的关联问题 1、问题1:

>> handles.axes1=axes('tag','tag1'); delete(handles.axes1);handles handles = axes1: 0.027

figure中的坐标轴已经被删除了,

12

但是为什么handles.axes还存在? 还有运行下面出错:

>> get(handles.axes,'tag')

??? Reference to non-existent field 'axes'. 问题症结:

delete(handles.axes1)是删除了和handles.axes1句柄相关联的对象,但是handles结构没有清空,其中仍然有axes1句柄的数值。只是这个句柄已经失效了,因为没有对象和它关联了。所以,你再用get或set想获得或设置对象的属性时就会出错。

另,设定的是handles.axes1,不是handles.axes,所以提示在handles结构中不存在axes这个句柄,而不是无效的句柄(invalid handle object)。

get(handles.axes,'tag') ??? Reference to non-existent field 'axes'. 2、问题2:

matlab help的一个例子:

% Create figure to use as GUI in your main function or a subfunction

figure_handle = figure(); % create structure of handles

myhandles = guihandles(figure_handle);

% Add some additional data as a new field called numberOfErrors myhandles.numberOfErrors = 0; % Save the structure

guidata(figure_handle,myhandles)

不是很明白guidata的用法,figure_handle和myhandles之间是什么关系?是如何进行保存的。

13

答:

这就是GUI里面的句柄和包含句柄的结构之间的区别。 figure_handle是和所创建的figure相关联的句柄,通过语句 myhandles = guihandles(figure_handle);

所获得的是和figure_handle句柄相关联的一个结构,此结构包含了该figure内所有控件的句柄,

比如:菜单、工具条等等控件的句柄,其中也包含figure_handle这个句柄。myhandles结构可以 储存与GUI有关的一切数据。

guidata(figure_handle,myhandles) 是保存与figure的句柄figure_handle相关联的myhandles结构。 5、Matlab利用定时器连续显示图片的问题

利用定时器连续显示图片,里面用的是image函数,但image函数显示图片大小会失真。于是改用imshow函数,能解决大小失真的问题。但每次点击播放,都会弹出可恶的窗口。调试发现,发现每次调用imshow时都弹出来。搞不清问题出在哪里。以下是图像播放的代码:

function picture_play(hobj,event,handles) global filename1; global pathname1; global number_of_file1; global index1; global A;

index1=index1+1;

if index1==number_of_file1+1 index1=1;

14

end

A=imread([pathname1,filename1{index1}]); cla;

imshow(A,'parent',handles.axes4);

strFileName=fullfile(pathname1,filename1{index1}); set(handles.filename_edit,'string',strFileName);

解决办法:

经过调试,追踪imshow函数的内部,终于找出了问题:

打开figure的属性编辑器,可见fugure的?HandleVisibily‘属性值默认为?callback‘,把它改为?on‘;同时确保?NextPlot‘的属性值为?add‘,问题解决。

另,新建的figure对象的HandleVisibily‘属性,默认值都为callback。 帮助文件说,这是matlab采取的一种保护措施,HandleVisibily‘属性值默认为?callback‘,figure的句柄只对其所包含控件的回调函数来说是可见的。这也可能是imshow和image函数在处理这一问题上的不同吧。 注意:类似的问题以前在论坛中也有会员提出过:

如何把波形绘制到指定的坐标轴上?发表于 2007-11-21 11:27 AM

15

在GUI做了一个有三个坐标轴的界面,用于显示从串口接收到的数据。 串口设置如下:

g = serial('COM1') ; g.InputBufferSize= 4096; g.OutputBufferSize= 4000; g.BaudRate= 9600;

g.BytesAvailableFcnMode = 'byte'; %中断触发事件为‘bytes-available Event‘?

g.BytesAvailableFcnCount = 45; %接收缓冲区每收到45 个字节时, 触发回调函数

g.BytesAvailableFcn = @instrcallback; %得到回调函数句柄 回调函数instrcallback的绘制波形部分程序如下: t =1:1:4;

axes(Ch1_Dis); %Ch1_Dis为坐标轴1句柄 hold on plot(t,ch1);

axes(Ch2_Dis); %Ch2_Dis为坐标轴2句柄 hold on plot(t,ch2);

axes(Ch3_Dis); %Ch3_Dis为坐标轴3句柄 hold on plot(t,ch3);

但是每次通过串口触发回调函数instrcallback时,执行到plot指令都会另建一窗口figure1,将波形绘制到另建的窗口中。

16

当不通过串口触发回调函数,而是在一按钮的回调函数中调用instrcallback时,就会把波形绘制到指定坐标轴中。 5-1、GUI中实现在图片任意位置上标注text

利用gtext函数。

gtext displays a text string in the current figure window after you select a location with the mouse.

gtext('string') waits for you to press a mouse button or keyboard key while the pointer is within a figure window. Pressing a mouse button or any key places 'string' on the plot at the selected location. 5-2、使用edit的另外一种callback

如果edit是多行的。想点击每一行的时候,能执行不同的事件,那么可以使用: 代码:

contents=get(hObject,'String'); a=contents(get(hObject,'Value')) 那么a就是你选择的对应的那一行。 6、MATLAB 如何实现图像的任意裁减?

(1)使用imrect和imcrop函数相结合,就可以实现截图功能。

用imcrop函数,例如:

I = imread('circuit.tif'); I2 = imcrop(I,[60 40 100 90]); figure, imshow(I)

figure, imshow(I2)

见自己编写的程序:picturecrop。

(2)剪取图像的中间区域:我想裁剪图像中间的部分,就是去掉图像周围部分!

17

1、首先取得图像的显示范围: x1=get(gca,'xlim'); y1=get(gca,'ylim'); width=x1(1,2)-x1(1,1); height=y1(1,2)-y1(1,1); 2、求的图像中心的坐标: x0=x1(1,1)+width/2; y0=y1(1,1)+height/2;

3、如果想剪切图像显示区域的1/4(以图像中心向四周剪切),则: a=width/4; b=height/4;

4、计算裁剪区域:(以图像中心点为裁剪中心) rect=[x0-a/2 y0-b/2 a b] 5、用imcrop裁剪: a=imcrop(A,rect);

7、坐标轴标注刻度、网格、文字方向

用两个矩阵画了一个图像,用grid on添加了网格,但是默认的网格太稀了,想要密一点的,该怎么解决?

1、用 set(AX,'XMinorGrid','on');set(AX,'XMinorGrid','on'); 2、(1)控制坐标轴尺度长度:set(gca,'XLim',[-pi/2 pi])

(2)定制自己想标注的刻度:

set(gca,'XTick',[-pi/2:pi/4:pi]) %%%坐标轴最小值,步长,最大值 3、xlabel(?x轴?,?rotation?,45);%x轴文字的方向,0为水平方向,90为垂直方向

4、将坐标的x轴做成10 的4次方,而不是10000这种形式。

18

set(gca,'xlim',[0 10e4]);

8、Matlab中对uitable的操作:调节各列宽度,设定某列是可编辑的 解决办法:

例子:例如想建立三行三列的table,并且要求第三列是可编辑的,其它两列是不可编辑的, 代码如下:

f = figure('Position',[100 100 400 150]);

dat = {6.125, 456.3457, 2.30;... %初始化各列的数值 6.75, 510.2342, 1.31;... 7, 658.2, 3.52};

columnname = {'Rate', 'Amount','Value'}; %各列的名称 columnformat = {'numeric', 'bank', 'numeric'}; %各列的数据类型

columneditable = [false false true ]; %各列是否是可编辑的,true是可以编辑,false是不可编辑

t = uitable('Units','normalized','Position',... [0.1 0.1 0.9 0.9], 'Data', dat,... 'ColumnName', columnname,...

'ColumnFormat', columnformat,... 'ColumnEditable', columneditable); 显示结果如下:

其中,第三列的数值是可以编辑的。

19

9、将在Matlab下编写的GUI转成独立于Matlab平台的应用程序

将在Matlab下编写的GUI转成独立于Matlab平台的应用程序Standalone Application。

具体过程:

目的是把一个Matlab GUI转成Standalone Application即不在Matlab平台下也可打开。

用的GUI文件见:单纯形法实现(GUI based on Matlab)

http://www.ilovematlab.cn/viewthread.php?tid=7634&highligh

t=+faruto

首先新建:File——》New——》Deployment Projiect,出现如下界面:

选择Standalone Application

20

在main function 中添加要转化的M文件:

单击Build project

等待编译完成:

21

编译完成后,在工作目录下会生成相关项目的文件夹:

其中distrib中有生成的.exe文件:

运行该.exe文件即可(这个.exe文件就是一个Standalone Application)。

最后生成的Standalone Application:[attach]8930[/attach

22

10、要将用Matlab语言编写的函数文件编译成可独立执行的*.exe文件

要将用Matlab语言编写的函数文件编译成可独立执行的*.exe文件(即可脱离Matalab环境的执行程序),首先要安装和配置好Matlab Compiler,一般来说,在安装Matlab时就已经安装了相应版本的Matlab Compiler。只是不同版本的Matlab,其编译器的使用方法有一定的差异,这一点要引起一定的注意。

在确定安装好Matlab Compiler后,还需要对Compiler进行适当的配置,方法是在Matlab命令窗口输入: Mbuild –setup

然后根据提示执行相应的操作,使用者可根据自己计算机中现有编译器的情况选择合适的编译器,如VC++ 6.0、VC++7.0、Bland C的编译器等,目前Matlab好象还不支持VC++8.0(我计算机安装的就是VC++2005,Matlab就无法识别)。当然,如果你的计算机里根本就没有安装其他任何语言的编译器,也可选择Matlab自带的Lcc编译器,其实这个编译器对大多数用户已经够用了(我就是选择的Matlab自带的Lcc编译器)。

配置好编译器后,自然就是对自己编写的M文件进行编译了。 将M文件编译为独立可执行文件的语法是: >>mcc –m fun1.m fun2.m….. 其中fun1就是最后的可执行文件的名称。

另外,也可通过采用命令开关-o指定编译最终目标文件的名称,如 mcc –m main.m –o mrank_main,就是将编译后的文件指定为mrank_main.exe。 编译后的生成文件根据编译器的版本不同而不同。具体的可参阅相关资料。

23

如果要在没有安装matlab的计算机上执行编译后的程序,首先要将\\MATLAB701\\toolbox\\compiler\\deploy\\win32中的MCRinstaller.exe安装到该计算机上(7.0以前的版本是mglinstaller.exe)。

其次是要将―MCRinstaller.exe安装目录\\runtime\\win32‖这个路径添加到该计算机的环境变量中,添加的方法是:

右击―我的电脑‖―属性‖―高级‖―环境变量‖―添加‖指定一个变量名,然后将上述路径复制到里面就可以了。

第三步是将编译生成的相相关文件拷贝到同一目录下(当然其他目录亦可)。

第四步是打开MS-dos操作窗口,进入到编译后的*.exe程序所在的目录,执行编译生成的*.exe文件即可。 需要说明的一个问题:

如果你的程序还附带有图片(如Version上的图标)、Web页面(如help文档),在编译的时候可能无法与M文件一起编译(因为我没有试过,也没有看到有关这方面的介绍),这没有关系,先在计算机上执行一次你编译后生成的独立可执行文件,这时在同一目录下会生成一个以你编译后的程序名+_mcr结尾的文件夹,这时,你只需要把与程序相关的图标和Web页面拷贝到该文件夹中的Matlabprogram下面的一个子目录(一般与用于编译的文件夹名相同)中即可。

其他的方法还有:(以下是网上搜索到的方法,没有试验过,有兴趣的朋友可以试一试)

方法一:在matlab下的workspace里打comtool,点file-open

24

project将我们先前建好的comtest.cbl工程文件打开,再点

component--package component就实现了打包,此时到comtest\\distrib文件夹里看,生成的comtest.exe就是打包后的解压程序,双击它会解压出一些文件,再点击解压出来的_install.bat就可以实现安装

方法二:如何将gui生成exe ? 已有gui.m文件和gui.fig文件 1 在matlab的command窗口中输入 mcc -B sgl GUI.m

2.将上步生成的文件包括*.m 文件和*.fig文件一起考到待运行的机器

此时仍需matlab所必需的动态连接库。 3. 将

path >/extern/lib/win32/mglinstallar.exel拷贝到到待运行机器上 4.在机器上先运行mglinstallar.exe, 然后选择解压目录,将在指定目录下解压缩出bin和toolbox两子目录,其中在bin\\win32目录下就是数学库和图形库脱离MATLAB运行所需的所有动态连接库,共有37个。可以将这些.dll考入system32, 也可以直接放在应用程序目录下。而toolbox目录则必须与应用程序同一目录。 5.大功告成。 matlab生成独立可执行的程序 引用

灵梦捕手 的 matlab生成独立可执行的程序

25

一、生成独立可执行的程序(exe文件)步骤

1、安装编译器。可有多种选择,本机安装的是microsoft visual c++ 6.0; 2、设置编译器。在matlab命令行输入mbuild -setup,选择安装的c编译器; 3、调用编译器。输入mcc -m filaname,filaname为要转成exe的m文件; 在以前的版本中,用编译命令mcc -B sglcpp filaname;自2006的版本后,替换为mcc -m filaname;

4、安装MATLAB7\\toolbox\\compiler\\deploy\\win32目录下的MCRInstaller。

二、脱离matlab运行可执行程序

MCR是由matlab的运行环境,占用不到400M的对于用不同matlab版本生成的exe文件,MCR版本也会有不同,因此,在程序打包时,最好将相应版本的MCR一起打包。MCR环境的设置文件存放目录如下:

\\MATLAB\\R2007a\\toolbox\\compiler\\deploy\\win32

文件名为MCRInstaller.exe。可将其拷贝到自己的文件夹中。

在其它机器上运行exe文件前,首先安装matlab的运行环境。在同一机器上可以并存不同版本的matlab环境。

Note: 将MCRInstaller.exe拷贝到你文件所在文件夹里,用打包程序来打包,生成安装文件,设定在解包过程中自动执行MCRInstaller.exe,同时将可执行文件的图标放在桌面。

11、matlab GUI程序转换成exe可执行文件 1.设置编译器:

26

在确定安装好Matlab Compiler后,还需要对Compiler进行适当的配置,方法是在Matlab命令窗口输入:

Mbuild –setup, 按提示选择matlab自带编译器LCC。 2.将脚本编译为可执行文件:

如项目文件包含:gui.m, gui.gif, fun1.m。

在此路径下命令行输入:mcc –m gui.m,生 成:mccExcludedFiles.log,ReadMe.txt,gui.ctf,gui.prj,gui_main.c,

gui_mcc_component_data.c,gui.exe。其中:gui.ctf,gui.exe为脱离matlab环境运行必需的文件。

3.在未安装matlab的机器上运行可执行程序。

将R2 2007b\\toolbox\\compiler\\deploy\\win32中的MCRinstaller安装到该计算机上,将生成可执行程序脱离matlab运行所需的函数库。 将2中生成的gui.ctf,gui.exe拷贝到该计算机同一路径。运行gui.exe将生成gui_mcr文件夹,包含程序运行所需的库。至此完成。 4.去除独立可执行程序运行时的“DOS黑窗口”。

以上生成的exe程序运行时首先弹出一个DOS界面窗口,如果不需要其输出数据和错误信息,可将其去除。 matlba命令行输入:

cd(prefdir) edit compopts.bat 此时compopts.bat打开,在文件最后添加:

set LINKFLAGS=%LINKFLAGS% -subsystem windows

如果程序比较复杂,易出现异常,则不建议去除这个dos窗口以便调试。

27

另外,这个办法是适用于你用的编译器为LCC,如果是其他的,那么所加语句有所不同

Microsoft Visual C/C++:

set LINKFLAGS=%LINKFLAGS% /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup Borland:

set LINKFLAGS=%LINKFLAGS% -aa 5.遇到某些函数不能使用的问题。

我的程序中用到vpa函数,运行gui.exe出现:undefined method or function 'vpa' for input argument type of 'double'错误提示。而gui.m脚本在matlab环境可以运行。

原因:百度搜到的信息为:matlab不支持符号工具箱的编译。只好避开使用此函数。

12、gui生成独立的应用程序的发布问题

―将MCRInstaller.exe文件、file.ctf文件和file.exe文件打包,粘贴至目标机器上后,解压,运行MCRInstaller.exe,将file.exe和file.ctf复制到应用目录下,添加目录\\runtime\\win32到用户系统路径(为MCR安装路径。‖)

1)这就话中―将file.exe和file.ctf复制到应用目录下‖是只哪个应用目录; 2)―添加目录\\runtime\\win32到用户系统路径(为MCR安装路径。)‖怎样添加目标到用户系统路径。

问题1:.exe和ctf在同一个目录就可以,就是只要在同一个文件夹就行的。 问题2:用户系统路径的添加是在环境变量里,我的电脑——>属性——>高级——>环境变量,添加即可。

28

13、GUI控制simulink模块及参数的综合实例! 最近在论坛上学习,虽然进度很慢,但收获不少!

现在将我在学习过程中对于GUI控制simulink时遇到过困难的一些功能做成一个综合实例放在这里,打个包希望给大家省点钱,也希望能够帮助到论坛里需要的朋友!同时以此感谢在我学习的过程中热心帮助过我的朋友们,感谢论坛! GUI and Simulink.rar (14.88 KB) 该实例主要功能:

1、演示了GUI界面的布局和效果;

2、演示了togglebutton、pushbutton对simulink模块参数的设置方法; 3、演示了Edit text 和slider的联合使用,及利用edit text 和slider 对simulink 参数的动态修改;

4、演示了simulink参数在GUI上的显示和更显;

5、语句进行了注释,为便于编译没用中文,大家凑或者看吧!

管理员:―会员RayneZ提醒:该帖子的楼主贴了一个GUI+Simulink的示例文件,但是有些小错误,matlab在运行的时候提示出错。

检查了一下,错误原因在GUI_ex11.mdl这个文件中的fcn2模块中的函数编写有些问题

第四行和第六行的逻辑判断语句中的&应该改为&& 更改后程序可以正常运行。

29

13-1、在axes显示图像后,在图像上单击鼠标时,回调函数的定义规则和使用方法

想在一个axe上显示一张图,在点击的时候放大图片我使用的是imshow函数。当没有显示图像的时候,单击axe有反应,但是一旦imshow之后单击就没有任何反应了请问怎么解决呢? 解决办法:

调试了一下,可以解决的。方法如下:

(1)在你的GUI的OpeningFcn函数中加入如下代码: axes(handles.axes1);

Image=imread('C:\\Users\\liuhuanjin\\Pictures\\5HPQ1IFA00AN0001.jpg'); %读取图像

hImage=image(Image); %显示图像,同时取得图像的句柄(handle) handles.hImage=hImage;%保存图像的句柄到handles结构,以备后用 guidata(hObject,handles);

set(hImage,'ButtonDownFcn',{@myCallback,5}); % 设置图像对象的

ButtonDown回调函数为自己定义的myCallback,并将5作为参数传递给它。

(2)在自己定义的myCallback函数中加入代码:

function myCallback(hObject,eventdata,arg1) ........%在此加入你的代码

因为图像显示后你点击的是图像,所以axes的那个ButtonDownFcn回调函数并没有调用。

关于自定义的callback的参数传递方法有:

30

Callback Function Syntax How to Specify as a Property Value

function myfile set(h, 'StartFcn', 'myfile')

function myfile(obj, event) set(h, 'StartFcn', @myfile) function myfile(obj, event, set(h, 'StartFcn', {'myfile', arg1, arg2)

5, 6})

function myfile(obj, event, set(h, 'StartFcn', {@myfile, arg1, arg2)

(另外有用的代码) axes(handles.axes2);

iptsetpref( 'ImshowAxesVisible' , 'on' ); %显示坐标轴set(zoom,'Direction','In','Enable','on'); %显示放大图标 Image=imread('C:\\Users\\liuhuanjin\\Pictures\\5HPQ1IFA00AN0001.jpg');

hImage=image(Image);

set(hImage,'ButtonDownFcn',@myCallback); handles.hImage=hImage;

14、如何在循环中加入waitbar,并在waitbar上添加?取消?按钮

有一个循环用来采集数据的,想加入一个waitbar并且在waitbar上加入按钮,在取消的同时中止循环不知怎么能实现。 stop=false;

h = waitbar(0.0,'Please

wait...','CreateCancelBtn','stop=true; delete(h); clear h'); set(h,'Name','optional window name'); for i=1:1000

waitbar(i/1000,h,['Update ' num2str(i)]);

5, 6})

31

if stop break; end

% do stuff end

效果如下:

另:waitbar的closeFcn如何设置

对循环过程加了一个waitbar同时加了一个Cancel按钮这个按钮可以中止循环但是要是在waitbar上点击关闭按钮,却会出现没有找到closeFcn的错误。想加closeFcn并且让他和cancel按钮起一样的作用这个怎么实现? 解决方法:

需要的功能是通过CloseRequestFcn 实现的,因为每次执行(点X)这个动作,系统是执行了CloseRequestFcn 。在你的m文件里,覆盖(override)这个函数就可以。

Help文档里,有这方面的例子。

比如说,当用户 点 X, 你可以弹出一个对话框,确认是不是要关闭,你可以定义一个函数,my_closereq: % my_closereq

% User-defined close request function % to display a question dialog box

32

selection = questdlg('Close Specified Figure?',... 'Close Request Function',... 'Yes','No','Yes'); switch selection, case 'Yes', delete(gcf) case 'No' return end

然后,在系统初始阶段,加上:

set(figure_handle,'CloseRequestFcn','my_closereq') 所以,只要修改my_closereq,符合自己的要求就可以了。 15、在matlab中对信号进行FFT变换

1. % --- Executes on button press in fft.

2. function fft_Callback(hObject, eventdata, handles) 3. global pathname filename sf nfft outfile H1 H2; 4. fid=fopen([pathname filename],'r');

5. x=fscanf(fid,'%f',[1,inf]); %按行读入原始信号数据 6. ?T变换 7. nt=length(x);

8. h=findobj('Tag','cypl');

9. sf=str2double(get(h,'string')); 10. h=findobj('Tag','nfftcd');

11. nfft=str2double(get(h,'string'));

12. y=fft(x);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

33

13. %绘制输入曲线图形 14. t=0:1/sf:100/sf; 15. plot(H1,t,x(1:101)); 16. xlabel('时间(s)'); 17. ylabel('幅值');

18. title('输入数据的时程曲线图') 19. grid on; 20. %绘制幅频曲线图

21. f=0:sf/nfft:(nt-1)*sf/nfft; 22. plot(H2,f,abs(y));

23. axis([0,(nt-1)*sf/(nfft*2),3*min(y)/2,3*max(y)/2]) 24. xlabel('频率(Hz)'); 25. ylabel('幅值'); 26. title('信号频谱图'); 27. outfile=y; 28. grid on 29. %grid on;

30. %h = findobj('tag',axes1)

31. % hObject handle to fft (see GCBO)

32. % eventdata reserved - to be defined in a future version of MATLAB

33. % handles structure with handles and user data (see GUIDATA)

16、动态显示figure中曲线的x-y坐标值的一个函数

34

函数定义如下所示。 使用方法为:

figure(1);

subplot(211), hline = plot(sin(1:10)); subplot(212), plot(sin(1:100));

dynpoint(hline);%调用函数时把hline句柄值传给函数 界面:

==========================================================

function dynpoint(arg,h)

% Show the coordinates of a plot dynamically %

% To start use: % dynpoint(h)

% where h is a handle to a figure, axes or e.g. line. %

% To delete use: % dynpoint('delete',h)

% where h is a handle to a figure, axes or e.g. line. % (you may also use: dynpoint delete) %

% There can only be one dynamic plotter in a figure at a time. %

% Example:

% subplot(211), hline = plot(sin(1:10)) % subplot(212), plot(sin(1:100)) % dynpoint(hline)

% 2002,6.29

if ~exist('arg','var')

35

arg = gcf; end

if ~isstr(arg) handle = arg; arg = 'init'; end

switch arg case 'init'

if ~ishandle(handle) error('h is not a handle') end

[h,ax] = h2hax(handle);

% delete old dynamic text object

ht = findobj(h,'tag',[mfilename '_text']); if any(ht) delete(ht) end

% text window at the bottom left corner % text in centred uicontrol(h,... 'style','text',... 'pos',[10 10 100 40],... 'tag',[mfilename '_text'],... 'userdata',ax(1))

% do the dynamic thing...

set(h,'windowbuttonmotionfcn',[mfilename ' move'])

case 'move'

ht = findobj(gcbf,'tag',[mfilename '_text']); ax = overobj('axes'); if ~any(ax)

ax = get(ht,'userdata'); end

p = get(ax,'currentpoint');

set(ht,'string',sprintf('%g %g', p(1),p(3)));

case 'delete' if ~exist('h','var')

36

h = gcf; end

[h,ax] = h2hax(h);

set(h,'windowbuttonmotionfcn','')

ht = findobj(h,'tag',[mfilename '_text']); delete(ht) end

% ----------

function [h,ax]=h2hax(handle)

typ = get(handle,'type'); if strcmp(typ,'figure') h = handle;

ax = findobj(h,'type','axes'); elseif strcmp(typ, 'axes') h = get(handle,'parent'); ax = handle;

elseif strcmp( get(get(handle,'parent'), 'type'), 'axes' ) ax = get(handle,'parent'); h = get(ax,'parent'); end

========================================================= 17、在GUI界面的打开按钮中,如何对文件进行操作

我要的数据是保存在一组具有相同前缀名*.dat,*.atr,*.hea中的。只有3个同时被使用,数据才能起作用。

我想做一个的界面,一个最基本的功能就是―打开‖按钮,它的作用是打开*.dat文件,并匹配和*.dat具有相同文件名的另外两个文件:*.atr,*.hea。实际上就是我表面上只是打开了那个*.dat文件,但程序会搜索和*.dat具有相同文件名的另外两个文件:*.atr,*.hea,一起打开,并把它们保存在3个变量里。

现在的困难是如何在同一个文件夹里搜索到另外两个文件?

解决方法:

37

1、给你个例子:

fileDir='C:\\Users\\liuhuanjin\\Documents\\MATLAB'; fileName='mydata.dat';

files = dir(fileDir); %列出文件夹中的所有文件,保存到files结构中 for i=1:length(files)

if (strcmp(files(i).name,fileName)==1) % 查找想要的文件 fullFileName=[fileDir '\\' fileName]; disp('Find the file!'); return end; end;

disp('Can not find such file');

2、%2.打开图片

[filename,pathname]=uigetfile(...

{'*.bmp;*.jpg;*.png;*.jpeg;*.tif','文件类型(*.bmp,*.jpg,*.png,*.jpeg,*.tif)';... '*.*', '所有文件(*.*)'},... 'Pick an image');

axes(handles.axes1);%用axes命令设定当前操作的坐标轴为axes1; fpath=[pathname filename];%将文件名和目录名组成一个完整的路径; I=imread(fpath);imshow(I);%用imread读入图片保存变量为I,并且imshow在axes1轴上显示

set(handles.getcurrentpoint_pushbutton,'Enable','on');%使其在打开命令使用后可使用,放在打开函数最后。 %3.读取在上面打开图片目录下的txt文件内容。

38

file=ls([pathname, '\\*.txt']);%文件名 for i = 1 : size(file, 1)

filepath{i} = strcat(pathname, '\\', file(i, :)); %合并路径及文件名 end

for m = 1 : length(filepath) a=importdata(filepath{i},'\\t'); for i=1:(size(a,1)-2) a{i}(~((a{i}>='0' & a{i}<='9') | a{i}=='.'|a{i}=='-'|a{i}==':'))=' '; end 3、

[filename1,pathname]=uigetfile(... {'*.dat','Data Files(*.dat)';... '*.*','All Files(*.*)'},... 'Pick an dat'); name=filename1(1:end-4); filename2=[name,'*.atr']; filename2=[name,'*.hea'];

data1=load([pathname,filename1]); data2=load([pathname,filename2]); data3=load([pathname,filename3]); 这样就可以了,剩下的你自己写

18、Matlab不同控件之间的数据传递问题

本人做了一4个button用于打开4个矩阵文件,第五个button用于把前四个button的数据写到一个矩阵中去。本人想实现若只输入前3个button的数据,第4个button不导入任何数据,如何实现第5个button能把前3个

39

button的数据也写到一个矩阵中去。以下是本人编的的条件语句,不好使啊!说明一下数据传递用的guidata型。

a=handles.a; b=handles.b; c=handles.c; d=handles.d; if isempty(d) A=[a b c]; else

A=[a b c d]; 解决方法:

按照你的描述,我编了个程序,可以实现你所说的功能。 首先在Openingfcn中初始化矩阵d为空矩阵; 然后在各按钮的回调函数中加入形如如下格式的语句:

handles.a=rand(3,3); % 随机生成3*3矩阵做测试 guidata(hObject,handles); 最后在第5个按钮的回调函数内加入如下代码:

a=handles.a; b=handles.b; c=handles.c; d=handles.d; if isempty(d)

A=[a b c]; else

A=[a b c d]; end

当不按按钮5时,d为空矩阵,则输出前三个矩阵;当按了按钮5时,d被赋

40

% 运行下面的代码 end 解决方法:

a=get(handles.edit1,'string'); b=get(handles.edit2,'string'); c=get(handles.edit3,'string');

val1=get(handles.popupmenu1,'Value'); str1=get(handles.popupmenu1,'String'); switch str1{val1} case 'string1'

if isempty(a) || isempty(b) || isempty(c) warndlg('编辑框为空!') else

% 运行下面的代码 end

case 'string2' % 同上 end

24、GUI中axes使用subplot时的清空及axes大小的固定的解决方法 看到过好几个类似下面问题的帖子:

1、axes显示图片时随着图片的大小变化,如何固定axes显示图片大小; 2、当在axes使用subplot画多个图时,如何清空图片,达到可以重复绘制图片的目的;昨天又遇到了

http://www.ilovematlab.cn/thread-47629-1-1.html 动手做了一个例子验证了一下,得出解决方法。

第一个问题很简单,把axes放到一个panel面板中即可;

第二个问题稍微麻烦点,有人可能会说用cla/cla reset,这个时候cla/cla

46

reset只能清除最后一个subplot对应的图,其他的不能清除,举个例子说一下解决方法:%画图程序: 代码:

h1=subplot(121); %记下句柄h1 x=imread('football.jpg'); imshow(x);

h2=subplot(122); %记下句柄h2 y=imread('arms.jpg'); imshow(y); %清空图像 代码:

global h1 h2; h=0;

if ishandle(h1) %判断h1是不是一个句柄 delete(h1);h=1; end

if ishandle(h2) %判断h2是不是一个句柄 delete(h2);h=1; end if h

axes('parent',handles.uipanel1) %重建一个axes end

47

25、退出GUI时如何把全局变量中的值清空?

我定义了一个global img=imread('x.bmp');一些处理img的程序。但是我退出界面程序时 再进入程序时img还是最后处理后的图像,怎么在退出程序时把img清空呢?

clear all;

26、从串口接受数据时,如何把波形绘制到指定的坐标轴上?

在GUI做了一个有三个坐标轴的界面,用于显示从串口接收到的数据。 串口设置如下:

g = serial('COM1') ; g.InputBufferSize= 4096; g.OutputBufferSize= 4000; g.BaudRate= 9600;

g.BytesAvailableFcnMode = 'byte'; %中断触发事件为‘bytes-available Event‘?

g.BytesAvailableFcnCount = 45; %接收缓冲区每收到45 个字节时, 触发回调函数

48

g.BytesAvailableFcn = @instrcallback; %得到回调函数句柄 回调函数instrcallback的绘制波形部分程序如下: t =1:1:4;

axes(Ch1_Dis); %Ch1_Dis为坐标轴1句柄 hold on plot(t,ch1);

axes(Ch2_Dis); %Ch2_Dis为坐标轴2句柄 hold on plot(t,ch2);

axes(Ch3_Dis); %Ch3_Dis为坐标轴3句柄 hold on plot(t,ch3);

但是每次通过串口触发回调函数instrcallback时,执行到plot指令都会另建一窗口figure1,将波形绘制到另建的窗口中。

当我不通过串口触发回调函数,而是在一按钮的回调函数中调用instrcallback时,就会把波形绘制到指定坐标轴中。 解决办法: 将程序改为:

plot(t,ch1,'parent',Ch1_Dis); plot(t,ch2,'parent',Ch2_Dis); plot(t,ch3,'parent',Ch3_Dis);

可是我不明白为什么以前用axes设置当前坐标轴不行,为什么在串口和定时器的回调函数中plot就不能在当前的坐标轴中绘图了,而用在其它函数就行! 问题的症结所在:matlab自身的原因 figure 的handlevisibility属性设置的问题,缺省为callback。要

49

显性地改为visibile。就可以了。否则,在定时器或串口的回调函数里绘图都会出现这种情况。

27、两个GUI之间如何传递数据

想做一个两个GUI界面的镶套 假如说 我建立一个GUI界面 绘制一个图形 然后需要在这个GUI界面的菜单里面加入一个按钮 这个按钮的作用是设置绘制这个图形的参数 就需要再打开一个GUI界面和我的主界面进行关联 请问这需要怎么实现? 解决方法:

以下介绍几种Callback之间最为常用的数据传递方式: 1.宣告为全域变量

将欲传递的变量在传递双方的Callback位置中都设为全域变量,就可以在任一方的Callback中调用。

使用说明:global传递变量的方式为当前有一组运算数据A必须在Tag名称为Pushbutton1与Pushbutton2所对应的对象Callback中使用,因此必须在双方的Callback中都设置这个数据A为全域变量。这样通过全域变量的宣告,数据A就可以跨越Pushbutton1与Pushbutton2这两个Callback的变量了。 2.应用对象的UserData属性

直接通过对象的UserData属性来进行各个Callback之间的数据存取操作。首先必须先将数据存储到一个特定的对象中,假设该对象的句柄值为ui_handle,需要存储的值为Value,则输入以下程序: >>set('ui_handle','UserData','Value')

此时,Value数据就已经存储在句柄值为ui_handle的对象中,在执行过程中若要取回该变量就可以通过以下方式在任一Callback中获取该数据值:

50

本文来源:https://www.bwwdw.com/article/md2r.html

Top