Bootstrap

Matlab资料汇总暨MATLAB中文论坛帖子整理(一)

本资料所有问题及代码均摘选自matlab中文论坛,主要供自己学习使用。非常感谢论坛的所有提出以及解答问题的会员。

目 录

1、GUI新手之——教你读懂GUI的M文件... 10
2、GUI程序中改变current directory引起的问题... 15
3、GUI中h0bject和handles 的区别... 16
4、handles结构中句柄和对象的关联问题... 17
5、Matlab利用定时器连续显示图片的问题... 19
5-1、GUI中实现在图片任意位置上标注text. 22
5-2、使用edit的另外一种callback. 22
6、MATLAB 如何实现图像的任意裁减?... 22
7、坐标轴标注刻度、网格、文字方向... 23
8、Matlab中对uitable的操作:调节各列宽度,设定某列是可编辑的... 24
9、将在Matlab下编写的GUI转成独立于Matlab平台的应用程序... 25
10、要将用Matlab语言编写的函数文件编译成可独立执行的*.exe文件... 28
11、matlab GUI程序转换成exe可执行文件... 31
12、gui生成独立的应用程序的发布问题... 33
13、GUI控制simulink模块及参数的综合实例!... 34
13-1、在axes显示图像后,在图像上单击鼠标时,回调函数的定义规则和使用方法... 35
14、如何在循环中加入waitbar,并在waitbar上添加‘取消’按钮... 36
15、在matlab中对信号进行FFT变换... 38
16、动态显示figure中曲线的x-y坐标值的一个函数... 40
17、在GUI界面的打开按钮中,如何对文件进行操作... 42
18、Matlab不同控件之间的数据传递问题... 45
19、在edit box里输入相关数据后,直接按回车键,不用鼠标点击pushbutton 就可以直接执行... 46
19-1 GUI使用editbox输入数据后如何自动清除数据... 46
20、在GUI中,计算结果怎么用excel来保存到指定的文件夹中... 47
21、如何得到popupmenu选项中最后一个字符串的VALUE值... 49
22、回调函数互相调用的问题... 49
22-2string和number相互转换的问题... 50
23、这样的功能的pushbutton的callback怎么写呀,谢谢了... 50
24、GUI中axes使用subplot时的清空及axes大小的固定的解决方法... 51
25、退出GUI时如何把全局变量中的值清空?... 53
26、从串口接受数据时,如何把波形绘制到指定的坐标轴上?... 53
27、两个GUI之间如何传递数据... 55
28-1 几个有用的帖子... 57
28-2、GUI之间互相调用和关闭问题... 60
29、GUI timer定时器... 60
30、如何在循环中加入waitbar. 61
31、如何连续读入图片!!... 62
32、如何把此次输入的值保存为下一次初始化的值... 63
33、Matlab关于解决自动保存gcf的问题... 63
34-1、在matlab里面如何读取excel里面的数据或者写入数据... 65
34-2、在excel中连续输入数据。... 66
35、Matlab GUI不同控件之间的数据传递问题... 68
36、怎么统计一个十进制数中"0"的个数??求助!... 69
37、Matlab对listbox里的条目能否一条条单独设置回调函数?. 70
38、键盘操作:matlab GUI中如何取得从键盘输入的按键的键值... 72
39、GUI如何响应鼠标事件... 73
40、matlab 截图、图像处理... 76
41、MATLAB GUI中利用定时器制作动画 - [MATLAB]. 84
42、MATLAB如何从GUI中返回参数 - [MATLAB]. 86
43、MATLAB 中GUI子程序的参数传递 - [MATLAB]. 87
44、Matlab保存axes上的图的问题(包括坐标轴)... 88
45、Matlab鼠标控制的两个GUI例子(附代码)... 91
46、分享初学的一个GUI例子--新手好好看看(图)... 97
47、axes清除畫面... 113
48、GUI中调用自己制作的帮助文件... 114
49、关于从gui调用simulink. 114
50、如何将菜单中退出项和窗口关闭的回调函数合并?... 117
51、matlab 日历程序... 119
52、如何在GUI里得一个axes实现双Y坐标轴... 121
53、如何实现动态的GUI界面... 121
54、关于GUI和simulink参数传递和执行... 122
55、代码运行时间的计时方法... 134
56、如何在GUI指定的axes中再画一个axes. 135
57、按下鼠标左键并拖动鼠标时的作图方法... 136
58、图像处理相关资料... 137
59、保存axes坐标轴上画的曲线或图形... 140
60、在GUI中如何打开IE. 141
61、gui输入数据,通过rs232传给芯片... 141
62、Matlab关于gui和excel的问题... 142
63、matlab 如何显示数学公式... 145
64、修改matlab自带的tabdlg的字体和颜色... 148
65、求助 Matlab的RGB彩色图合成... 148
66、如何删除已绘制的曲线?... 149
67、总结一下,MATLAB中随机矩阵获得... 150
68、【原创】GUI设计中背景音乐的定制与关闭... 153
69、Matlab如何改变GRID 网格线的颜色?... 156
71、把plot图上的某些曲线排除在lengend之外,即不用legend标注出来... 157
72、如何连续对矩阵追加数值... 158
73、两个等直径圆管的交线... 160
74、Matlab的csvread读取数据的问题... 161
75、在对数坐标系插值的问题... 162
76、实现在原有图像上的部分图像变为白色... 162
78、如何实现双击listbox中的条目才表示选中... 163
79、如何删除矩阵中的NaN. 164
80、用平行截面法讨论由曲面z=x^2-y^2构成的马鞍面形状。... 164
81、如何利用ode45解方程... 165
82、Matlab图片如何批处理?pic变量逐一读取文件夹所有图片名... 165
83、方程为:exp(-x)=cos(x),用迭代法求出最小的正根,当相对误差<=10e-6时,求根结束。... 166
84、通过鼠标点击控制循环... 166
85、图像经连续小波分解后的显示效果图... 167
85-1、怎样查看图像的属性... 169
86、想产生如下的矩阵:6行10列,每行都是1 2 3 4 5 6 7 8 9 10。... 169
87、textread读取.txt中数据... 169
88、数制之间的转换怎么实现... 170
89、matlab读取大数据文件的方法... 172
90、从状态空间方程转换为传递函数... 174
91、生成0 1 2 3 4 5 6 7 8 随机出现大小为20X20的矩阵!... 174
92、存储绘图过程,并播放视频... 175
93、如何同时读入多个文件,并作图?... 175
94、MATLAB GUI编程中几个有用的程序段... 177
95、Matlab如何在给定区域随机取点?... 180
96、数据如何导入到workspace中,并执行?在GUI里面,怎么传递处理。... 180
97、matlab下画‘心’的程序。... 181
98、点到直线的距离怎么求?... 181
99、如何绘制正态分布图?... 185
100、matlab作图时,如何只保存图像而不显示图像... 185
101、在三维图中只显示x,y轴,不显示z轴... 186
102、cell array和矩阵的显示... 186
103、矩阵形式的转换... 188
104、如何判断鼠标是否在figure内的某一区域?... 189
105、一个有用的程序... 189
106、窗口的最大化、最小化、图标、置顶... 191
107、连续生成文件名的问题... 193
108、编辑框edit中输入公式后的绘图问题... 194
109、MATLAB中plot命令绘图微调的几个注记 (转自职业仓库)... 195
110、MATlab 三维图中显示z坐标轴的极大极小值... 203
111、如何一次性清空GUI程序的handles结构中的变量... 203
112、Matlab如何给元胞中的每个一维向量前增加同一个数?... 204
113、用guide生成的不同GUI之间控件的互相操作... 206
114、自定义Matlab figure 工具栏按钮... 208
115、matlab 有没有按某个小数位数做四舍五入的函数?... 209
116、有关矩阵中小于某值的数取整的问题... 209
117、Matlab表面被截后的部分... 210
118、如何是imshow显示的图像充满整个figure?... 211
119、图像颜色统计直方图... 211
120、Matlab如何将大元胞数组写入到txt文件... 212
121、构造特殊矩阵(右螺线状的)... 213
122、figure中多坐标轴中曲线的legend标注... 214
123、GUI中鼠标选中并显示曲线的类型及坐标... 215
124、Matlab中y=1\x围绕y轴旋转形成的旋转曲面... 218
125、GUI程序一开始以‘最大化’显示的问题... 219
126、如何实现文本自动转换... 219


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文件里面,会看到最外层,也就是最上面那一一行
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写入这一句,就表示你把这个数据放缸里了
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就会执行一次。
函数的输入参数
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界面的一个属性。(要想知道各个控件有什么属性,在它上面双击就看到了。)所以同样,也可以用这种方式输入其他的初始化命令。
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下面添加 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函数体代码对第二个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内所有控件的回调函数访问,因为回调函数的输入参数中都有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中的坐标轴已经被删除了,
但是为什么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之间是什么关系?是如何进行保存的。
答:
这就是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;
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
在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,将波形绘制到另建的窗口中。
当不通过串口触发回调函数,而是在一按钮的回调函数中调用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)剪取图像的中间区域:我想裁剪图像中间的部分,就是去掉图像周围部分!
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这种形式。
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);
显示结果如下:


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

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&highlight=%2Bfaruto
首先新建:File——》New——》Deployment Projiect,出现如下界面:

选择Standalone Application

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

单击Build project
等待编译完成:

编译完成后,在工作目录下会生成相关项目的文件夹:
其中distrib中有生成的.exe文件:
运行该.exe文件即可(这个.exe文件就是一个Standalone Application)。

最后生成的Standalone Application:[attach]8930[/attach
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。
编译后的生成文件根据编译器的版本不同而不同。具体的可参阅相关资料。
如果要在没有安装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 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. 将 <matlab path >/extern/lib/win32/mglinstallar.exel拷贝到到待运行机器上
4.在机器上先运行mglinstallar.exe, 然后选择解压目录,将在指定目录下解压缩出bin和toolbox两子目录,其中在bin\win32目录下就是数学库和图形库脱离MATLAB运行所需的所有动态连接库,共有37个。可以将这些.dll考入system32, 也可以直接放在应用程序目录下。而toolbox目录则必须与应用程序同一目录。
5.大功告成。
matlab生成独立可执行的程序
引用
灵梦捕手 的 matlab生成独立可执行的程序
一、生成独立可执行的程序(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.设置编译器:
在确定安装好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窗口以便调试。
另外,这个办法是适用于你用的编译器为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复制到应用目录下,添加目录<mcr_root>\runtime\win32到用户系统路径(<mcr_root>为MCR安装路径。”)
1)这就话中“将file.exe和file.ctf复制到应用目录下”是只哪个应用目录;
2)“添加目录<mcr_root>\runtime\win32到用户系统路径(<mcr_root>为MCR安装路径。)”怎样添加目标到用户系统路径。
问题1:.exe和ctf在同一个目录就可以,就是只要在同一个文件夹就行的。
问题2:用户系统路径的添加是在环境变量里,我的电脑——>属性——>高级——>环境变量,添加即可。
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模块中的函数编写有些问题
第四行和第六行的逻辑判断语句中的&应该改为&&
更改后程序可以正常运行。
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的参数传递方法有:
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, arg1, arg2)
set(h, 'StartFcn', {'myfile', 5, 6})
function myfile(obj, event, arg1, arg2)
set(h, 'StartFcn', {@myfile, 5, 6})

(另外有用的代码)
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)]);
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

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. %FFT变换
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);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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坐标值的一个函数
函数定义如下所示。
使用方法为:

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')
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')
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个变量里。
现在的困难是如何在同一个文件夹里搜索到另外两个文件?
解决方法:
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文件内容。
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个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被赋值,不为空,则输出a,b,c,d四个矩阵。
19、在edit box里输入相关数据后,直接按回车键,不用鼠标点击pushbutton 就可以直接执行
请教:让push button执行一个程序的simulation, 在界面得所有edit box里输入相关数据后,想要直接按回车键 不用鼠标点击pushbutton 就可以直接执行, 该怎么编辑push button的callback呀
解决方法:
(1)设置控件的tab order。程序运行后,用tab键选定pushbutton,直接按"空格键",不用点击pushbutton就可以;
(2)在最后的edit控件的callback函数内加入执行simulation的命令,最后的edit控件输入完成后直接按'回车键'就可以运行simulation;或者调用button按钮的callback也行。
(3)在KeypressFcn函数内加入相应的命令。这个方法还是需要在edit内输入完数据后,在figure的空白处点一下鼠标,然后按键盘的任意键才行。
根据你的意思,你是不想用鼠标点button按钮,按enter就执行button内的代码,那第(2)种方法是可行的。以上方法经实际测试,均是可行的!
19-1 GUI使用editbox输入数据后如何自动清除数据
我编了一个GUI, 使用的时候会需要输入一些数据, 我放了一个editbox和一个按钮"Enter", 用的时候就是在editbox里面输入数据, 然后按"Enter"确认. 现在问题就是输入好数据,按了Enter之后, editbox里面的数据还在, 下次再输入的时候就要先删除后再输入, 我想问一下有没有什么办法能够让按了Enter键之后, editbox里面的数据就会清除掉, 这样下次再输入的时候就不用先删除了。
在enter按钮的回调函数里加入如下代码处理即可:
value1=get(handles.edit1,'string');%先取得编辑框的数据
set(handles.edit1,'string','');%再把编辑框清空
20、在GUI中,计算结果怎么用excel来保存到指定的文件夹中
问题:GUI设计的结果怎么用EXCEL来保存到指定的文件夹。
说明:根据论坛上的例子做了个GUI界面,结果可以保存到EXCEL里面,但保存的路径只能是在当前文件夹,我希望保存到指定的文件夹,怎样才能把数据结果以EXCEL表格的形式保存到指定的文件夹?高手指点一下,不胜感激。。。
解决方法:
例如:要把‘第一行’、‘第二行’、‘第三行’分别添加到excel表格的三列可开头,用以下命令:
M={‘第一行’,’ 第二行’,’ 第三行’};%定义为cell类型
xlswrite(‘myexcel.xls’,M);
结果:
1、
a=get(handles.edit1,'string');
b=get(handles.edit2,'string');
m={a;b};
[filename, pathname] = uiputfile('*.xls', '保存计算结果');
if filename==0 % 取消
return;
end
oldpath=cd;
cd(pathname);
[pathstr,filename]=fileparts(filename);
xlswrite(filename,{'X取值:'},'sheet1','A1');
xlswrite(filename,{'y=x^3+x^2+x的结果:'},'sheet1','A2');
xlswrite(filename,m,'sheet1','B1:B2');
cd(oldpath);
2、
a=get(handles.edit1,'string');
b=get(handles.edit2,'string');
m={a;b};
[filename, pathname] = uiputfile('*.xls', '保存计算结果');
if filename==0 % 取消
return;
end
[pathstr,filename]=fileparts(filename);
xlswrite(filename,{'X取值:'},'sheet1','A1');
xlswrite(filename,{'y=x^3+x^2+x的结果:'},'sheet1','A2');
xlswrite(filename,m,'sheet1','B1:B2');
21、如何得到popupmenu选项中最后一个字符串的VALUE值
在popupmenu下拉菜单中有许多行内容,如何得到最后一行的value值?
解决方法:
在popupmenu的回调函数中加入代码如下:
function popupmenu1_Callback(hObject, eventdata, handles)
list_menu=get(handles.popupmenu1,'String'); %先得到存放菜单项的cell列表
string=list_menu{end}; %得到最后菜单项的字符串
value=length(list_menu);%得到最后菜单项的Value值
disp(value);
或者用以下代码:
str=get(handles.popupmenu1,'string');
s=str(end) %最后一行内容
val=size(str,1) %最后一行所处行数
22、回调函数互相调用的问题
想在一个按钮的回调函数下运行另一个回调函数,句子该如何写?
就像如下调用就可以。回调函数没有什么特别的,也是普通的函数,只不过它是响应控件的操作的。
解决方法:
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to mybutton (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
pushbutton2_Callback(hObject, eventdata, handles);

% --- Executes during object creation, after setting all properties.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to mybutton (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
22-2string和number相互转换的问题
t2_1=get(handles.edit_t21,'String')
t2_2=get(handles.edit_t22,'String')
ua=get(handles.edit_ua,'String')
phi=get(handles.edit_phi,'String')
a_bmax=phi*9.8
s_zhidong=(t2_1+t2_2/2)*ua/3.6+ua^2/25.92/a_bmax
set(handles.text_zhidongjuli,'String',num2str(s_zhidong));
问题出现在:
a_bmax=phi*9.8这句不对,因为phi=get(handles.edit_phi,'String')是从edit控件中返回字符串,必须用str2double或str2num转换为数字类型后才能使用。
23、这样的功能的pushbutton的callback怎么写呀,谢谢了
pushbutton实现下面的功能:
先判断edit(3个)是不是为空,接着读取popupmenu中的信息(2个选项),当两者都符合要求的时候执行相关的命令这样的pushbutton的callback怎么写呀,我写的
a=get(handles.edit1,'string');
b=get(handles.edit2,'string');
c=get(handles.edit3,'string');
if isempty(a) || isempty(b) || isempty(c)
warndlg('编辑框为空!')
else
% 运行下面的代码
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 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

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 个字节时, 触发回调函数
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。要显性地改为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中获取该数据值:
>>Value=get('ui_handle','UserData')
3.应用setappdata,getappdata,rmappdata函数
此种函数使用上非常类似上述的UserData,但是克服了它的缺点,使一个对象能够存取多个变量值,因此会比UserData属性在操作上更具有弹性与数据安全性。
(1)setappdata
此函数可由定义的对象中获得特定的变量值,
value=getappdata(H,Name)
由定义的对象中获得变量名称为Name的值。其中H为对象句柄值,如果该变量不存在,则matlab会返回一个空矩阵。
(2)getappdata
此函数可由定义的对象中建立一个变量值
setappdata(H,Name,value)
由定义的对象中建立一个变量名称为Name而内容为value的值。其中H为对象句柄值,如果该变量不存在,则matlab会自动设置Name与value。
(3)rmappdata
此函数用以移除定义对象中由setappdata指定的变量值,
rmappdata(H,Name)
移除定义的对象H中由serappdata指定的变量Name的值。
4、可以通过workplace传递数据,使用assignin和evalin函数
函数说明如下:
ASSIGNIN Assign variable in workspace.
ASSIGNIN(WS,'name',V) assigns the variable 'name' in the
workspace WS the value V. WS can be one of 'caller' or 'base'.
EVALIN Evaluate expression in workspace.
EVALIN(WS,'expression') evaluates 'expression' in the context of
the workspace WS. WS can be 'caller' or 'base'. It is similar to EVAL
except that you can control which workspace the expression is
evaluated in.

[X,Y,Z,...] = EVALIN(WS,'expression') returns output arguments from
the expression.
举个例子方便理解:
如果在figure1中有个变量a1
则传入时assignin('base','a1',data) %data是workplace中的变量
在figure2传出时a2=evalin('base','data'); %a2是figure2中的变量
28-1 几个有用的帖子
引自王辉版主回复的一个帖子:http://www.ilovematlab.cn/thread-56517-1-3.html
===========================================================
你看看这些帖子:
题目:(不同GUI之间控件的调用(原创))
论坛讨论地址:
http://www.ilovematlab.cn/thread-52762-1-1.html
功能描述:
1、利用handles结构在控件之间传递数据。利用guihandles获得与传入的句柄相关联的handles结构,从而对不同GUI的控件进行操作。
2、 有两个GUI: GUI1和GUI2,在GUI1中可以操作GUI2的坐标轴,绘制曲线;同样,在GUI2中可以操作GUI1的坐标轴,绘制曲线。
3、在GUI1的edit中输入数据,点击按钮,可以在GUI2的edit中显示出来;同样,在GUI2的edit中输入数据,点击按钮,可以在GUI1的edit中显示出来。

题目:利用GUI的输入输出参数实现不同GUI之间数据的传递
论坛讨论地址:
http://www.ilovematlab.cn/thread-52846-1-1.html
功能描述:
有两个GUI程序,GUI1和GUI2,在GUI1中调用一副图片并显示,然后点击按钮‘gui1->gui2’,在gui2中显示该图片。在gui2中完成图片的剪切,并把剪切后的图片在GUI1中显示出来。

题目: Matlab多个窗口之间传递参数的问题
论坛讨论地址:http://www.ilovematlab.cn/thread-52712-1-3.html
讨论问题:对于多个GUI之间参数的传递的讨论
最后结论: 该帖子对GUI之间参数的传递讨论的很深入。

题目:不同GUI之间控件的互相操作及数值的设定
论坛讨论地址:http://www.ilovematlab.cn/thread-52762-1-5.html
实现功能描述:
1、利用handles结构在控件之间传递数据。利用guihandles获得与传入的句柄相关联的handles结构,从而对不同GUI的控件进行操作。
2、 有两个GUI: GUI1和GUI2,在GUI1中可以操作GUI2的坐标轴,绘制曲线;同样,在GUI2中可以操作GUI1的坐标轴,绘制曲线。
3、在GUI1的edit中输入数据,点击按钮,可以在GUI2的edit中显示出来;同样,在GUI2的edit中输入数据,点击按钮,可以在GUI1的edit中显示出来。

题目: Matlab关于数据传递的一个要点
论坛讨论地址:
http://www.ilovematlab.cn/thread-52917-1-7.html
讨论问题:多个GUI之间进行数据传递的问题

题目:Matlab的GUI参数传递方式
论坛讨论地址:
http://www.ilovematlab.cn/thread-46145-1-11.html
问题描述:
在gui设计中,经常会有gui内部控件之间,各个不同gui间的参数传递方式,因此对于参数传递方式的研究也是一个很热门而由意义的话题。
最后结论:帖子中给出了七种参数传递的方式:
1) 运用gui本身的varain{}、varaout{}传递参数。2)运用global定义全局变量传递参数。
3)运用UserData传递参数。
4)应用setappdata\getappdata与rmappdata函数。5)结合handles和guidata函数。
6)运用save和load(importdata)。
7)共享变量访问的方法 nested函数。
并分别说明了各种方法的使用范围(gui内、外)和优劣。

28-2、GUI之间互相调用和关闭问题
假设有两个GUI:GUI1和GUI2,它们之间怎么互相调用和关闭?
解决方法:
假设在GUI1的按钮的回调函数里调用GUI2:
hGUI2=GUI2(); % hGUI2是GUI2对象的句柄
若想在GUI1中关闭GUI2,只需要代码:
close(hGUI2);
29、GUI timer定时器
这是显示时间的一段定时器代码,注释是我自己写的,希望大牛帮小弟看看。
t = timer('TimerFcn', {@timerCallback, handles.edit1}, 'ExecutionMode', 'fixedDelay', 'Period', 1.0);% 创建 timer 对象 TimerFcn表征创建定时器回调函数,其句柄是timerCallback,同时向其传递参数handles.edit1,后面的很好理解,不再赘述。
set(handles.figure1, 'DeleteFcn', {@DeleteFcn, t});% 设置figure1窗口关闭的回调函数其中'DeleteFcn'是删除时间发生时的回调函数,其句柄是DeleteFcn,传递参数是t。
start(t); % 启动定时器
function timerCallback(obj, event, hEdit) % timer 对象的回调函数-更新编辑框显示的时间
set(hEdit, 'String', datestr(now, 'HH:MM:SS'));
function DeleteFcn(hObject, eventdata, t) % 窗口关闭的响应函数-停止计时器
stop(t);
以上是一定时器窗口,小弟想把其嵌入在我的GUI界面中,并增设开始结束按键。
在 openingFcn中增加以下代码,建立定时器回调函数。
t = timer('TimerFcn', {@timerCallback, handles.edit1}, 'ExecutionMode', 'fixedDelay', 'Period', 1.0);
function timerCallback(obj, event, hEdit)
set(hEdit, 'String', datestr(now, 'HH:MM:SS'));
在 开始 案件 的回调函数中增加
start(handles.t);
在结束按键的回调函数中增加
stop(handles.t);
这是我的思路,但在运行中却报错 Error while evaluating uicontrol Callback.

解决方法:
t=timer('TimerFcn',{@timercallback,handles},'ExecutionMode', 'fixedDelay', 'Period', 1.0);
以上,定义定时器时,指定的传入参数必须要与GUI传递的参数相符,GUI只会在各个callbacks之间传递它的handles (另外两个忽略)。
所以同样,timer的callback除了handles“要”不到别的东西。以下。
function timercallback(obj, event,handles)
set(handles.edit1, 'String', datestr(now, 'HH:MM:SS'));
30、如何在循环中加入waitbar
有一个循环用来采集数据的,想加入一个waitbar并且在waitbar上加入按钮,在取消的同时中止循环,不知怎么能实现。
解决方法:
视频版有一个GUI的视频讲了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)]);
if stop break; end
% do stuff
end
if exist('h') delete(h); end
31、如何连续读入图片!!
如何一次性读入多张图片,并且让它们逐个处理比如像我上个问题所说的图像分割,就是只按一下button然后系统就自动逐个处理。并且在处理完了把这些图像的名称显示在一个listbox中!
解决方法:
Matlab里提供了非常方便的函数。
假如你的待处理图片放在当前image文件夹里,假设都是jpg格式,当然这些假设你可以随意改。

第一步: files = dir('test/*.jpg');
那么files就含有所有图片的属性,我们需要的只是图片的name, 用来读。
所以你就写一个for loop
把每一个图片的name提取出来,然后调用你的程序就可以了。
完整程序:
files = dir('test/*.jpg');
[row col]=size(files);
for j=1:row
im=imread(files(1,1).name); %读
im2='你图像处理程序' %处理 图像
str=['E:\test\',num2str(j), '.bmp'];
imwrite(im2,str); %写图片
end;
把程序放到你的button callback里就可以,修改里面的路径。
32、如何把此次输入的值保存为下一次初始化的值
想实现这样的操作:此次输入数据,通过保存按钮作为下一次打开时的初始化的数据。
解决方法:
这个是读写文件的问题,你可以把数据保存在文件里,然后每次打开GUI的时候,就读这些文件。每次退出时,保存当前数据,覆盖原来的文件。
33、Matlab关于解决自动保存gcf的问题
具体问题:使用rectangle做矩形后,如果想用imwrite保存图像,由于没有加入矩形的像素阵,无法保存当然图像状态;如果想用save as来存储figure窗口,往往会默认加入白边,下面的代码解决了这个问题,存储效果较好。
这里我也就不多说交互式作图和设置figure窗口属性的情况了,只是强调一下如何能自动保存当前的gcf。
代码:
clc; close all; clear;
I = imread('westconcordaerial.png');
fg = figure;
set(fg, 'name', 'Viewer');
set(fg, 'NumberTitle', 'off');
old_units = get(fg, 'Units');
set(fg, 'Units', 'pixels');
figpos = get(fg, 'Position');
pos = get(fg, 'Position');
set(fg, 'Position', [pos(1) pos(2) size(I, 2) size(I, 1)]);
set(fg, 'Units', old_units);
old_units = get(gca, 'Units');
set(gca, 'Units', 'pixels');
set(gca, 'position', [0 0 size(I, 2) size(I, 1)]);
set(gca, 'Units', old_units);
imshow(I);
flag = 1; rectn = 0;
while flag == 1
[a, b, flag] = ginput(1);
if flag == 1
rectangle('position', [a - size(I, 1)/30, b - size(I, 2)/30,...
size(I, 1)/15, size(I, 2)/15],...
'LineWidth', 3, 'edgecolor', 'r');
rectn = rectn + 1;
end
end
str = sprintf('You Plot %d rectangle!', rectn);
helpdlg(str, 'report');
f = getframe(gca); %Capture screen shot
[im,map] = frame2im(f); %Return associated image data
if isempty(map) %Truecolor system
rgb = im;
else %Indexed system
rgb = ind2rgb(im,map); %Convert image data
end
str = sprintf('%drect.png', rectn);
imwrite(rgb, str);
34-1、在matlab里面如何读取excel里面的数据或者写入数据
(1)读取数据
global chuizhifashetuilishuju;
global chuizhifashetuilixianshi;
[filename pathname]=uigetfile({'*.xls'},'Choose the file');
str=[pathname filename];
b=char([0 0]);
c=char(str);
if strcmp(b,c)
else
[INL,txt]=xlsread(str);
chuizhifashetuilishuju=INL;
chuizhifashetuilixianshi=str;
set(handles.chuizhifashetuilixianshi, 'String', str);
end
(2)写入数据
我想把一个字符串写入电子表格,格式如下:'第i组'. 我使用命令:i=2;suc=xlswrite('test_data',['第',num2str(i),'组'],'a1:a1'),结果在电子表格中只能看到一个字'第',如何能够在电子表格中显示我想要的结果:'第2组'',。
解决办法:
把代码改成如下形式:
i=2;
str=sprintf('第%d组 ',i);
suc=xlswrite('test_data',{str});
不要用[str],要用{str}。
或者:
问题的关键是,你的代码输出的是字符串,你要把原来的字符串,转换为元胞数组就可以了。用mat2cell函数。
>> i=2;
>> data=['第',num2str(i),'组'];
>> d=mat2cell(data)
d =
'第2组'
>> suc=xlswrite('test_data',d,'sheet1', 'A1')
suc =
1
34-2、在excel中连续输入数据。
大体是通过GUI写入exce数据,我们常见的格式是:xlswrite('filename',M,sheet,'range')。我做了一个简单的界面,也可以将数据存入excle里面,但是这种存入没有连续性,只能存入特定的一行。因为在range方面,我不熟悉,书上给的例子是'A1:C1',也就是限制死了范围,我希望能将1变成一个变量n,我每次点击保存,变量n就自动的加1,但是试了几次,关于变成变量n的格式不会掌握,所以格式老是错误。
另外我发现,如果写入的excel先被打开的话,m文件是无法运行的。只有把它关掉,才可以运行,这个问题能解决吗? [by makesure5]
function pushbutton1_Callback(hObject, eventdata, handles)%保存按钮
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
number=get(handles.number,'string');
name= get(handles.name,'string');
sex= get(handles.sex,'string');
age = get(handles.age,'string');
data = {name,sex,age};
str=sprintf('A%s:C%s',number,number);
xlswrite('data.xls',data,str)

data1={'number','name','sex','age'};
data2={number,name,sex,age};
set(handles.uitable1,'data',data1);
set(handles.uitable1,'data',data2);

function pushbutton2_Callback(hObject, eventdata, handles)%重置按钮
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
set(handles.number,'string','');
set(handles.name,'string','');
set(handles.sex,'string','');
set(handles.age,'string','');

% --- Executes during object creation, after setting all properties.
function uitable1_CreateFcn(hObject, eventdata, handles)%uitable初始化
% hObject handle to uitable1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
data=[[],[],[],[]];
set(hObject,'data',data);
效果图:



35、Matlab GUI不同控件之间的数据传递问题
本人做了一4个button用于打开4个矩阵文件,第五个button用于把前四个button的数据写到一个矩阵中去。本人想实现若只输入前3个button的数据,第4个button不导入任何数据,如何实现第5个button能把前3个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被赋值,不为空,则输出a,b,c,d四个矩阵。

36、怎么统计一个十进制数中"0"的个数??求助!
题目:编写M函数统计十进制数值中"0"的个数,然后编写脚本文件实现统计所有自然数1~2006中"0"的总个数。
方法1:
a=102030405;
b=num2str(a);
c=findstr('0',b);
n=length(c);
方法2:
clc; clear;
zero1 = 0; zero2 = 0;
for x = 1 : 2006
% 获取字符串,两种方式
str1 = num2str(x);
str2 = sprintf('%d', x);
% 获取0个数
zeros1 = length(strfind(str1, '0'));
zeros2 = length(strfind(str2, '0'));
zero1 = zero1 + zeros1;
zero2 = zero2 + zeros2;
end
fprintf('\n Use num2str, the number is: %d\n', zero1);
fprintf('\n Use sprintf, the number is: %d\n', zero2);
37、Matlab对listbox里的条目能否一条条单独设置回调函数?
如果不能,那么想要达到这种效果应该怎么办?

问题说明:
在我设计的GUI界面中,我用菜单menu设回调函数在listbox里打开1个名为“Sample”的TXT, listbox内容如下: (第一项为列表名字,第二项开始每项都是图片名称,格式为“.jpg ”)
Test_Sample
Image1 Image1.jpg
Image2 Image2.jpg
Image3 Image3.jpg
Image4 Image4.jpg
Image5 Image5.jpg
Image6 Image6.jpg
Image7 Image7.jpg
Image8 Image8.jpg
Image9 Image9.jpg
Image10 Image10.jpg
程序如下:
fin=fopen('Sample.txt','r'); % 注:在工作路径下
str=fgetl(fin);
[str1 ]=strread(str,'%s');
YangBen(1)=str1;
Counter=2;
global bianhao;
while feof(fin)==0
str=fgetl(fin);
[name bian]=strread(str,'%s %s','delimiter',' '); %name数组中存第一列,bian数组中存第二列
YangBen(Counter)=name;
bianhao(Counter-1)=bian;
Counter=Counter+1;
end;
set(handles.listbox1,'string',YangBen);
fclose(fin)
当我分别点击“Image1、Image2、...Image10”时,想分别调用“Image1.jpg、Image2.jpg、...Image10.jpg”图像即样本图像使其显示在GUI界面(已插入一个axes)
请问这个程序该怎么补充呢?
我自己在这个回调函数下function listbox1_Callback(hObject, eventdata, handles)添加了如下代码:
global bianhao;
value=get(hObject,'value');
if(value==1)
vulue=1;
else
value=value-1;
end
a=bianhao(value);
ImageYePian=imread('a'); %读彩色图像
axes(handles.axes1);
imshow(ImageYePian);title('叶片原图');
运行出现错误:
??? Error using ==> imread
File "a" does not exist.
38、键盘操作:matlab GUI中如何取得从键盘输入的按键的键值
在callback中用以下代码即可实现:
key = get(handles.figure1,'CurrentKey'); % 取得当前按键的名称,是return、space...
switch key
case 'a'
value=dec2hex(97);
hexvalue=sprintf('0x%s',value);
disp(hexvalue);
case 'b' .....................
end
或者:
key = eventdata.Key; % È¡µÃµ±Ç°°´¼üµÄÃû³Æ£¬ÊÇreturn¡¢space...
switch key
case 'space'
msgbox('你按下了空格键!!!!');
end
key的ASCII码值参见ASCII码表。

39、GUI如何响应鼠标事件
这些性质都是附属於一个图形视窗,因此,他们规范了在此图形视窗
下,各项滑鼠事件的反应指令。
一般而言,我们希望滑鼠先被按下,然后再移动滑鼠时,才会触发移
动时的反应指令.欲达到此效果,我们必须做下列项:
l在滑鼠按钮被按下时,设定 WindowButtonMotionFcn 及
WindowButtonUpFcn 的值.
l在滑鼠按钮被释放时,清除 WindowButtonMotionFcn 及
WindowButtonUpFcn 的值.
因此,只有在滑鼠按钮被按下,且滑鼠在移动时,对应於
WindowButtonMotionFcn 的反应指令才会被呼叫.
以下我们用一个简单的例子来说明.在这个例子中,滑鼠事件会产生
下列反应:
l按下滑鼠时,MATLAB 指令视窗会出现「Mouse down!」的
讯息.
l按下并移动滑鼠时,MATLAB 会在图形视窗画出滑鼠轨迹,并
指令视窗印出「Mouse is moving!」及当时滑鼠的位置.
l释放滑鼠时,MATLAB 指令视窗会出现「Mouse up!」的讯息.
function tmouse(action)
% TMOUSE 本例展示如何以Handle Graphics来设定滑鼠事件(Mouse
% Events)的反应指令(Callbacks)
if nargin == 0
action = 'start';
end
switch(action)
% 开启图形视窗
case 'start',
axis([0 1 0 1]);% 设定图轴范围
box on;% 将图轴加上图框
title('Click and drag your mouse in this window!');
% 设定滑鼠按钮被按下时的反应指令为「tmouse down」
set(gcf, 'WindowButtonDownFcn', 'tmouse down');
% 滑鼠按钮被按下时的反应指令
case 'down',
% 设定滑鼠移动时的反应指令为「tmouse move」
set(gcf, 'WindowButtonMotionFcn', 'tmouse move');
% 设定滑鼠按钮被释放时的反应指令为「tmouse up」
set(gcf, 'WindowButtonUpFcn', 'tmouse up');
% 列印「Mouse down!」讯息
fprintf('Mouse down!\n');
% 滑鼠移动时的反应指令
case 'move',
currPt = get(gca, 'CurrentPoint');
x = currPt(1,1);
y = currPt(1,2);
line(x, y, 'marker', '.', 'EraseMode', 'xor');
% 列印「Mouse is moving!」讯息及滑鼠现在位置
fprintf('Mouse is moving! Current location = (%g, %g)\n', currPt(1,1), currPt(1,2));
% 滑鼠按钮被释放时的反应指令
case 'up',
% 清除滑鼠移动时的反应指令
set(gcf, 'WindowButtonMotionFcn', '');
% 清除滑鼠按钮被释放时的反应指令
set(gcf, 'WindowButtonUpFcn', '');
% 列印「Mouse up!」讯息
fprintf('Mouse up!\n');
end
40、matlab 截图、图像处理
要求利用MATLAB GUI设计实现图像处理的图形用户界面,利用MATLAB图像处理工具箱实现以下的图像处理功能:
双击打开MATLAB 7.0→File→New→GUI→单击 ,调整axes1大小→单击OK,调整按钮大小和颜色,修改名称→再建axes2→单击OK,调整按钮大小和颜色,修改名称→保存→View→M-file Edit→写程序
1)图像的读取和保存。
在function open_Callback(hObject, eventdata, handles)后面输入如下程序
[name,path]=uigetfile('*.*','');
file=[path,name];
axes(handles.axes1);
x=imread(file); %读取图像
handles.img=x;
guidata(hObject, handles);
imshow(x); %显示图像
title('打开');
在function save_Callback(hObject, eventdata, handles)后面输入如下程序
[name,path]=uigetfile('*.*','');
file=[path,name];
axes(handles.axes1);
x=imread(file);
handles.img=x;
guidata(hObject, handles);
imshow(x);
imwrite(x,'new.jpg'); %保存图像
title('保存');
2)设计图形用户界面,让用户能够对图像进行任意的亮度和对比度变化调整,显示和对比变换前后的图像。
在function liangdu_Callback(hObject, eventdata, handles) 后面输入如下程序
axes(handles.axes2);
x=(handles.img);
y=imadjust(x,[0.15 0.9], [0 1]); %增亮图像
imshow(y);
title('亮度')
在function huidu_Callback(hObject, eventdata, handles) 后面输入如下程序
axes(handles.axes2);
x=rgb2gray(handles.img); %RGB图像转换为灰度图像
imshow(x);
title('灰度')
3)设计图形用户界面,让用户能够用鼠标选取图像感兴趣区域,显示和保存该选择区域。
在function cut_Callback(hObject, eventdata, handles)后面输入如下程序
axes(handles.axes2);
x=imcrop(handles.img); %截图
imshow(x);
imwrite(x,'cut.jpg'); %保存图像
title('截图');
4)编写程序通过最近邻插值和双线性插值等算法将用户所选取的图像区域进行放大和缩小整数倍的操作,并保存,比较几种插值的效果。
在function nearfangda_Callback(hObject, eventdata, handles) 后面输入如下程序
axes(handles.axes2);
x=imresize(handles.img,2,'nearest'); %最近邻插值法放大
imshow(x);
imwrite(x,'nearfangda.jpg')
title('最近邻插值法放大');

在function nearsuoxiao_Callback(hObject, eventdata, handles) 后面输入如下程序
axes(handles.axes2);
x=imresize(handles.img,0.5,'nearest'); %最近邻插值法缩小
imshow(x);
imwrite(x,'nearsuoxiao.jpg')
title('最近邻插值法缩小');
在function doublefangda_Callback(hObject, eventdata, handles) 后面输入如下程序
axes(handles.axes2);
x=imresize(handles.img,5,'bilinear'); %双线性插值法放大图像
imshow(x);
imwrite(x,'doublefangda.jpg');
title('双线性插值法放大');
在function doublesuoxiao_Callback(hObject, eventdata, handles) 后面输入如下程序
axes(handles.axes2);
x=imresize(handles.img,0.5,'bilinear'); %双线性插值法缩小图像
imshow(x);
imwrite(x,'doublesuoxiao.jpg');
title('双线性插值法缩小');
5)图像直方图统计和直方图均衡,要求显示直方图统计,比较直方图均衡后的效果。
在function zhifangtu_Callback(hObject, eventdata, handles) 后面输入如下程序
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
x=imhist(handles.img); %直方图统计
x1=x(1:10:256);
horz=1:10:256;
bar(horz,x1);
%axis([0 255 0 150000]);
set(handles.axes2,'xtick',0:50:255);
%set(handles.axes2,'ytick',0:2000:15000);
set(handles.axes2,'HandleVisibility','OFF');
在function junheng_Callback(hObject, eventdata, handles) 后面输入如下程序
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
h=histeq(handles.img); %直方图均衡
imshow(h);
%set(handles.axes2,'ytick',0:2000:15000);
set(handles.axes2,'HandleVisibility','OFF');
6)能对图像加入各种噪声,并通过几种滤波算法实现去噪并显示结果。比较去噪效果。
在function gaussian_Callback(hObject, eventdata, handles) 后面输入如下程序
axes(handles.axes2);
x=(handles.img);
y=imnoise(x,'gaussian',0,0.05); %加高斯噪声
imshow(y);
imwrite(y,'gaussian.jpg');
title('加高斯噪声')
在function salt_Callback(hObject, eventdata, handles) 后面输入如下程序
axes(handles.axes2);
x=(handles.img);
y=imnoise(x,'salt & pepper',0.04); %加椒盐噪声
imshow(y);
imwrite(y,'salt.jpg');
title('加椒盐噪声')

在function medfilt_Callback(hObject, eventdata, handles) 后面输入如下程序
axes(handles.axes2);
x=(handles.img);
y=imnoise(x,'salt & pepper',0.04); %加椒盐噪声
z=medfilt2(y,[5 5],'symmetric'); %中值滤波
imshow(z);
imwrite(z,'medfilt.jpg');
title('中值滤波');

在function wiener_Callback(hObject, eventdata, handles) 后面输入如下程序
axes(handles.axes2);
x=(handles.img);
y=imnoise(x,'gaussian',0,0.05); %加高斯噪声
z=wiener2(y,[5 5]); %自适应滤波
imshow(z);
imwrite(z,'wiener.jpg');
title('自适应滤波')

7)频谱处理,能够分析图像频谱,显示频谱图。
在function pinputu_Callback(hObject, eventdata, handles) 后面输入如下程序
axes(handles.axes2);
x=(handles.img);
J2=fft2(x); %傅立叶变换
K2=fftshift(J2); %转换数据矩阵
imshow(log(abs(K2)),[]); %显示频谱图
title('频谱图');
8)设计巴特沃斯低通滤波对图像进行低通滤波处理,显示结果。
在function butterdi_Callback(hObject, eventdata, handles) 后面输入如下程序
axes(handles.axes2);
x=(handles.img);
y1=imnoise(x,'salt & pepper'); % 叠加椒盐噪声
f=double(y1); % 数据类型转换,MATLAB不支持图像的无符号整型的计算
g=fft2(f); % 傅立叶变换
g=fftshift(g); % 转换数据矩阵
[M,N]=size(g);
nn=2; % 二阶巴特沃斯(Butterworth)低通滤波器
d0=50; %截止频率为50
m=fix(M/2); n=fix(N/2);
for i=1:M
for j=1:N
d=sqrt((i-m)^2+(j-n)^2);
h=1/(1+0.414*(d/d0)^(2*nn)); % 计算低通滤波器传递函数
result(i,j)=h*g(i,j);
end
end
result=ifftshift(result);
y2=ifft2(result);
y3=uint8(real(y2));
imshow(y3); % 显示滤波处理后的图像
imwrite(y3,'butterdi.jpg');
title('巴特沃斯低通滤波')
9)设计高斯高通虑波器,显示结果。
axes(handles.axes2);
x=(handles.img);
y1=imnoise(x,'gaussian'); %加高斯噪声
f=double(y1); % 数据类型转换
k=fft2(f); % 傅立叶变换
g=fftshift(k); % 转换数据矩阵
[M,N]=size(g);
nn=2;
d0=25; %截止频率为25
m=fix(M/2); n=fix(N/2);
for i=1:M
for j=1:N
d=sqrt((i-m)^2+(j-n)^2); % 计算高通滤波器传递函数
if d<=d0
h=0;
else h=1;
end
result(i,j)=h*g(i,j);
end
end
result=ifftshift(result);
y2=ifft2(result);
y3=uint8(real(y2));
imshow(y3); % 显示滤波处理后的图像
imwrite(y3,'gaussiangao.jpg');
title('高斯高通滤波')
41、MATLAB GUI中利用定时器制作动画 - [MATLAB]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://liuxqsmile.blogbus.com/logs/17282262.html
MATLAB中提供了一些动态显示图形的例子,例如vibes、truss等,但他们的程序结构都和由GUIDE产生的M文件的结构不同。truss中用while循环来更新图形窗口,pause函数来控制更新的速度。这样的结构是不适合放在某一个子函数中来执行的,否则程序在执行该子函数时无法响应用户的其它操作,只能一开始就设置终止条件,等待动画的自然结束。
MATLAB中的定时器timer可以定时触发,周期性地执行指定的函数,我们可以据此来实现绘图的自动更新,而不会影响整个GUI对用户其它操作的响应。
比如我们要让一个曲面随时间周期性地变形,类似vibes中的情形,按下“开始”按钮后,曲面开始周期振动,同时我们可以调整振幅大小、周期的长短。所不同的是我们一切都在子函数中完成。
在GUIDE中建立界面元素后,在“开始”按钮的callback中建立一个定时器timer对象object
handles.timer=timer(Period,0.05,ExecutionMode,FixedRate,... TimerFcn,{@PlotUpdate,handles});
Period是触发的周期,这里设置为0.05s,ExecutionMode是执行的方式,可以有三种选择,对于不需要精确控制时序的动画的影响不大,TimerFcn指定触发时所执行函数的句柄,在这里我们建立一个函数PlotUpdate来执行绘图命令,handles作为参数传递到PlotUpdate中去。
注意PlotUpdate的定义:
function PlotUpdate(obj,events,handles)
前两个参数是必不可少的,最后的handles才是用户传递的数据。在这个函数中你基本上可以无视前两个参数,按照曲面的运动趋势产生新的顶点坐标,然后用set命令将新的坐标赋给曲面(面片patch)对象的Vertices属性。drawnow更新就可以了。你可以用曲面对象的UserData属性存放当前振动的幅值相位等参数。
然后在“停止”按钮的callback中st(handles.timer)停止定时器,就可以停止自动绘图了。
在“增大振幅”按钮的callback中对振幅参数作修改。排除了一些小问题后,你的曲面终于可以动起来了,按“增大振幅”等也没有影响图形的运动,真的是“一点影响都没有”啊!
问题出在哪里呢?原来,当定时器第一次触发时,用户指定的参数被传递到响应函数中执行,以后每一次触发,都是使用的这同一组参数,并不会随着程序的运行而更新。好了,现在可以在“增大振幅”中重新赋一次参数
set(handles.timer,TimerFcn,{@PlotUpdate,handles});

;