文章目录

Matlab做工程计算和数据分析好用,想给写好的算法套个界面其实也不难。不管是让同学老师用,还是做课设毕设需要交互效果,学会GUI设计都能帮上大忙。很多人不知道从哪下手,其实跟着步骤走,半天就能做出一个能用的界面。这篇文章讲讲Matlab做GUI的两种方式,新手直接看App Designer就行。
选对工具很重要:GUIDE还是App Designer
现在用Matlab做界面,主要就是两个选择。GUIDE是老工具了,用了很多年,网上不少老教程都是讲这个。App Designer是后来出的,设计更合理,用起来也顺手。
新手直接学App Designer,别绕弯子。GUIDE官方都不更了,新项目没必要碰。真哪天碰到老代码要维护,再看也不迟。
10分钟上手App Designer
打开Matlab,顶部工具栏有个"App"标签,点进去选"Design App"就打开了。左边是各种组件,按钮、文本框这些都在这,中间拖放设计,右边改属性。
拖个按钮到中间,右边就能改文字、大小、颜色。双击这个按钮,直接跳去代码区,自动给你生成好点击回调函数的架子,填自己的代码就行。
试一下最简单的,点按钮弹个提示框:
matlab
% Button pushed function: HelloButton
function HelloButtonPushed(app, event)
msgbox('Hello World!');
end
写完点一下工具栏的"Run",界面直接就弹出来了。就是这么快。
常用组件怎么用
做一般的小工具,几个常用组件就够了。
按钮和文本框
按钮肯定用得最多。除了普通按钮,还有开关、单选框、复选框,满足不同选择需求。文本框用来让用户输参数,还能限制只能输数字,超出范围自动提示。
比如做数据拟合工具,让用户输入拟合阶数:
matlab
% OrderEditFieldValueChanged function
function OrderEditFieldValueChanged(app, event)
order = app.OrderEditField.Value;
if order < 1 || order > 10
errordlg('阶数请在1-10之间');
end
end
坐标区显示图形
做数据分析,总得显示图形吧。拖个"UIAxes"组件进去,画图的时候指定一下画到这个坐标区就行。
matlab
% PlotButtonPushed function
function PlotButtonPushed(app, event)
x = linspace(0, 2*pi, 100);
y = sin(x);
plot(app.UIAxes, x, y, 'r-', 'LineWidth', 2);
xlabel(app.UIAxes, 'x');
ylabel(app.UIAxes, 'y');
end
用法和你平时写的plot基本一样,就多第一个参数指定坐标区。要多个子图,就拖多个UIAxes进去,位置自己调。
下拉菜单给用户选
有几个固定选项让用户挑,用下拉菜单最合适。比如选算法、选数据集之类的场景。
matlab
% 下拉菜单选项改变时触发
function AlgorithmDropDownValueChanged(app, event)
selected = app.AlgorithmDropDown.Value;
switch selected
case '最小二乘法'
% 执行最小二乘法
case '神经网络'
% 执行神经网络
end
end
解决布局乱飘的问题
刚学做GUI,很容易碰到窗口一放大,组件位置全乱了。这个问题App Designer早就想到了,用布局容器就能解决。
网格布局好用
把整个界面分成几行几列,组件放格子里。给每行每列设好权重,窗口放大缩小时,组件自动跟着变大小。
用法很简单:拖个"Grid Layout"进来,属性里设好行数和列数,再把各个组件拖进对应格子就行。
面板给组件分组
功能相关的组件放一块,用面板框起来,用户看着也清楚。参数输入一块,结果显示一块,画图一块,一目了然。
多个回调之间怎么共享数据
做界面总有这个问题:A回调里拿到的数据,B回调要用怎么办?比如用户在文本框输了参数,点按钮要用到这个数。
App Designer的设计很方便,所有数据都存在app对象里。定义个私有属性,哪里都能读能写。
在代码编辑器的"Private Properties"里加上这么一句:
matlab
properties (Access = private)
inputData % 存储输入数据
result % 存储计算结果
end
之后不管哪个回调函数,直接读直接写:
matlab
app.inputData = readmatrix('data.csv');
比GUIDE用全局变量舒服多了,不用怕变量名撞车。
打包成独立EXE
界面做好了,想给没装Matlab的人用?直接打包成独立App就行。
在App Designer点"Share"->"Export as standalone App",跟着向导走就能生成exe。前提是你得装了MATLAB Compiler工具箱。
打出来的包确实有点大,几十兆,因为要把Matlab运行时打包进去。对方不用装Matlab,双击就能跑。
GUIDE简单说两句(维护老代码看这里)
要是你接手老项目,代码用GUIDE写的,大概了解一下就行。GUIDE把界面存在.fig文件,代码存在.m文件,思路也是拖放组件写回调。
命令行输这个就能打开:
matlab
guide
但是真不建议做新项目还用这个,功能少,写着也麻烦。
实战:做个简易数据拟合工具
说这么多,不如来个完整例子。我们做个小工具:导入csv数据,选拟合阶数,点按钮出拟合结果图。
界面规划:
- 最上面:按钮导入文件
- 中间:左边输阶数,右边拟合按钮
- 最下面:画图显示结果
核心代码:
matlab
% 导入文件按钮
function ImportButtonPushed(app, event)
[file, path] = uigetfile('*.csv');
if isequal(file, 0)
return;
end
app.inputData = readmatrix(fullpath(path, file));
msgbox('导入成功');
end
% 拟合按钮
function FitButtonPushed(app, event)
if isempty(app.inputData)
errordlg('请先导入数据');
return;
end
x = app.inputData(:, 1);
y = app.inputData(:, 2);
order = app.OrderEditField.Value;
p = polyfit(x, y, order);
y_fit = polyval(p, x);
plot(app.UIAxes, x, y, 'o', x, y_fit, 'r-', 'LineWidth', 2);
legend(app.UIAxes, '原始数据', '拟合曲线');
end
一百行不到代码,能用的数据拟合工具就出来了。
碰到这些问题怎么办
运行后界面一片空白
八成是你没在App Designer里点Run,直接点开m文件运行了。App Designer生成的文件不能这么跑,要么从设计器启动,要么命令行输app名字运行。
点按钮没反应
看看回调函数生成了没有,名字对不对。App Designer是按命名规则自动绑的,别手贱改函数名,改了就找不到了。
打包失败
先确认你装了MATLAB Compiler,命令行输ver就能看到已装工具箱。没装的话回去补装。
其实Matlab做GUI门槛真不高,拖拖组件写写回调,半天就能搞出一个能用的小工具。比起用Python攒GUI,还要记各个库的API,Matlab快得多,做课设毕设原型特别合适。
。App Designer是按命名规则自动绑的,别手贱改函数名,改了就找不到了。
打包失败
先确认你装了MATLAB Compiler,命令行输ver就能看到已装工具箱。没装的话回去补装。
其实Matlab做GUI门槛真不高,拖拖组件写写回调,半天就能搞出一个能用的小工具。比起用Python攒GUI,还要记各个库的API,Matlab快得多,做课设毕设原型特别合适。