您的位置:标准吧 > 标准下载 > MATLAB 中文论坛相关帖子整理

MATLAB 中文论坛相关帖子整理

时间:2013-1-16 21:41:24 作者:115.156.154.66 来源:MA 阅读:4896次
MATLAB  中文论坛相关帖子整理
 
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  7
文件里面,会看到最外层,也就是最上面那一一行
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 写入这一句,就  8
表示你把这个数据放缸里了
   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 就会执行一次。   9
函数的输入参数
    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 界面的一个属性。(要想知道各个控件  10
有什么属性,在它上面双击就看到了。)所以同样,也可以用这种方式输入其他
的初始化命令。
    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 下面添加   11
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',hObj
ect,eventdata,guidata(hObject)) ??? Error while evaluating
uicontrol Callback 
    应该是某个地方设置的问题。pushbutton 里面的函数体好像没问题。就算
在第二个函数体里面只编写一个很简单的赋值语句也会出现同样的错误,调试发
现点击第二个pushbutton 时根本没有进入到这个函数体内。好像是点击了一个
pushbutton后再点击第二个 pushbutton它就找不到这第二个 pushbutton
的callback函数了。但如果两个 pushbutton 都编写简单的赋值语句发现没
有错误,说明第一个 pushbutton的callback 函数体代码对第二个  12
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 内所有控件的回调函  13
数访问,因为回调函数的输入参数中都有 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中的坐标轴已经被删除了,   14
但是为什么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之间是什么关
系?是如何进行保存的。   15
答:
这就是 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;   16
     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   17
在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,将波形绘制到另建的窗口中。   18
当不通过串口触发回调函数,而是在一按钮的回调函数中调用 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)剪取图像的中间区域:我想裁剪图像中间的部分,就是去掉图像周围部分!   19
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 这种形式。   20
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);
显示结果如下:
 
 
其中,第三列的数值是可以编辑的。
   21
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=%2Bfaruto
首先新建:File——》New——》Deployment Projiect,出现如下界面:
 
 
选择Standalone Application
   22
在main function 中添加要转化的M 文件:
 
单击Build project
 
等待编译完成:
 
   23
编译完成后,在工作目录下会生成相关项目的文件夹:
 
其中distrib 中有生成的.exe 文件:
 
运行该.exe 文件即可(这个.exe 文件就是一个 Standalone Application)。 
 
最后生成的Standalone Application:[attach]8930[/attach   24
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。 
        编译后的生成文件根据编译器的版本不同而不同。具体的可参阅相关资
料。   25
        如果要在没有安装 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   26
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 生成独立可执行的程序   27
一、生成独立可执行的程序(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\win
32
文件名为MCRInstaller.exe。可将其拷贝到自己的文件夹中。
    在其它机器上运行 exe 文件前,首先安装 matlab的运行环境。在同一机器
上可以并存不同版本的 matlab环境。
Note: 将MCRInstaller.exe拷贝到你文件所在文件夹里,用打包程序来打
包,生成安装文件,设定在解包过程中自动执行 MCRInstaller.exe,同时将
可执行文件的图标放在桌面。
11、matlab GUI 程序转换成 exe 可执行文件
1.设置编译器:   28
在确定安装好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 窗口以便调试。   29
另外,这个办法是适用于你用的编译器为 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:用户系统路径的添加是在环境变量里,我的电脑——>属性——>高级——>环
境变量,添加即可。   30
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模块中的
函数编写有些问题
      第四行和第六行的逻辑判断语句中的&应该改为&&
       更改后程序可以正常运行。   31
13-1、在 axes 显示图像后,在图像上单击鼠标时,回调函数的定义规则和使用
方法
想在一个 axe上显示一张图,在点击的时候放大图片我使用的是 imshow 函
数。当没有显示图像的时候,单击 axe 有反应,但是一旦 imshow 之后单击就没
有任何反应了请问怎么解决呢?
解决办法:
调试了一下,可以解决的。方法如下:
(1)在你的GUI 的OpeningFcn函数中加入如下代码:
  axes(handles.axes1);
  Image=imread('C:\Users\liuhuanjin\Pictures\5HPQ1IFA00
AN0001.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 的参数传递方法有:   32
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\5HPQ1IFA00AN000
1.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)]);   33
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   34
 
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);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%   35
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坐标值的一个函数
  函数定义如下所示。
  使用方法为:
   36
figure(1);
subplot(211), hline = plot(sin(1:10)); 
subplot(212), plot(sin(1:100)); 
dynpoint(hline);%调用函数时把hline句柄值传给函数  
 
 
4896
国家标准下载

下载说明:
1.请先分享,再下载
2.直接单击下载地址,不要使用“目标另存为”
3.压缩文件请先解压
4.PDF文件,请用PDF专用软件打开查看
5.如果资料不能下载,请联系本站
最新评论
发表评论
大名:
联络: QQ 或者 邮箱
内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。

验证码: 9859