技术文章和通讯

用MATLAB编写应用程序

作者:David Garrison, MathWorks


一个应用程序是一个自包含的MATLAB®程序,带有图形用户界面,可以自动完成任务或计算。完成任务所需的所有操作——将数据输入应用程序,对数据执行计算,并获得结果——都在应用程序中执行。

从R2012b开始,您可以打包自己的应用程序与其他MATLAB用户共享。你也可以下载别人写的应用程序MATLAB中央文件交换或其他源,并将它们安装在apps库中(图1)。

图1。MATLAB应用程序画廊,自定义应用程序安装在我的应用程序。
图1。MATLAB应用程序库,自定义应用程序安装在“我的应用程序”中。

编写应用程序

因为应用程序具有用户交互的GUI,所以编写应用程序在某些方面不同于编写其他MATLAB程序。当你写一个应用程序时,你是在创建一个事件驱动的程序。一旦你的应用程序出现在屏幕上,它通常会一直处于空闲状态,直到用户通过与应用程序交互引起一个事件——例如,通过输入文本或单击一个按钮。作为对该行为的回应,a回调函数是执行。该回调函数由应用程序的作者提供,执行一些代码来响应触发它的事件。例如,单击a运行按钮可能执行一个回调函数,该函数执行一些工程计算并更新GUI中显示的图形。

在事件驱动编程中,每个事件回调都是一个简短的函数,它必须获得完成工作所需的数据,根据需要更新应用程序,并将结果存储在其他回调可以访问的地方。底层应用程序本质上是一组小函数的集合,它们一起工作以完成更大的任务。在编写事件驱动程序时,您将面临为应用程序中的控件编写回调以及管理要在这些回调之间共享的信息的问题。

MATLAB支持两种编写应用程序的方法。您可以:

  • 从头开始编写代码
  • 使用GUIDE, MATLAB图形用户界面设计环境

大多数用户发现使用GUIDE更容易图形化地布局GUI,并为应用程序生成事件驱动的框架。然而,有些用户更喜欢从从头创建应用程序中获得的额外控制。本文描述了一种使用面向对象编程从头开始编写应用程序的方法。我们发现这种方法是创建健壮用户界面的有效方法。

使用对象:股票行情应用程序示例

对象管理一组相关函数及其共享的数据。对象对于编写事件驱动程序特别有用。然而,不幸的是,许多程序员避免使用对象,要么因为他们认为对象太复杂,要么因为他们发现学习面向对象编程的任务令人生畏。

别担心。你不需要成为面向对象编程的专家来使用对象来构建应用程序。你只需要理解一些基本的概念。

创建对象时,需要定义两个东西:对象的列表属性—存储在对象中的数据—及其方法-操作存储在对象属性中的数据的函数。

让我们看一个简单的股票行情应用程序,它更新给定股票代码随时间变化的股票价格图(图2)。

图2。简单的股票行情应用程序。
图2。简单的股票行情应用程序。

simpleStockTickerMATLAB程序创建实现应用程序的对象。

程序的第一行告诉MATLAB您正在定义一个新类。

classdef simpleStockTicker处理

classdef关键字定义一个新的对象类型(“类”)。课程的名字,simpleStockTicker,必须匹配MATLAB文件的名称。这一行的最后一部分,<处理,指示MATLAB不要复制此对象。你所有的应用都会像这样开始;只有类名(simpleStockTicker在我们的例子中)将会改变。

接下来是属性部分。属性部分由属性结束……语法。它是定义对象将使用的数据的地方。

属性

这个类使用两组属性。前五个属性存储用户界面可视化组件的句柄——图形、轴、绘制价格的线、“符号”标签和可以输入股票符号名称的编辑框。最后四个属性存储用于获取和绘制股票价格的数据。类的任何方法都可以使用这些属性。

使用属性有助于解决编写应用程序时的一个常见问题:在哪里存储需要由应用程序的不同部分共享的数据。传统上,最常见的方法是使用guidata或全局变量来存储共享数据,但这些方法都有局限性。它很难保持guidata最新的,并在应用程序需要时访问数据。存储为属性的共享数据很容易定义,也很容易从应用程序的任何地方访问。

方法定义对象的属性之后,定义它的方法方法结束……语法。第一种方法构造函数,用于创建对象。构造函数的名称总是与类的名称相同。

函数的应用

注意,构造函数必须有一个输出变量。输出变量用于引用由构造函数创建的对象。你可以给它起任何名字。我们示例中的类使用这个名称应用程序.输出变量是特殊的,因为它在类定义文件中使用,以引用对象的属性和方法。例如,你可以引用对象的NumValues属性app.NumValues.类的所有方法都用这个特殊变量作为第一个参数来定义。

在我们的示例中,constructor函数执行三个任务:它在用户界面中创建所有可视对象,初始化要绘制的价格,并创建一个Timer对象,该对象将定期更新以获得最新的股票价格。控件控制更新速率app.TimerUpdateRate类的属性。

这个类中的下三个方法是回调函数。下面是CloseRequestFcn回调图窗口。当图形关闭时调用它。它看起来与您编写的其他回调函数相似,只有一个例外:变量应用程序必须插入到方法的参数列表的开头。

函数closeApp

注意,类定义文件可以包含非回调的其他方法—例如getQuote方法。这个方法由类的其他方法调用。

使用类的优点

程序员经常宣扬面向对象编程优于传统函数式编程的优点。他们引用封装抽象,多态性作为使用面向对象方法的理由。虽然这些都是有用的概念,但您不需要理解它们就可以将应用程序编写为MATLAB类。使用类来创建应用程序的最重要原因是,类提供了一种有用的方式来管理应用程序不同部分共享的数据。对象的属性保存了应用程序的方法(回调)之间需要共享的所有数据。你不再需要担心使用guidata或者全局变量,因为现在所有的数据都存储在类的属性中。

有关使用类构建应用程序的更多示例,请参见“了解更多”部分。

发布于2012 - 92062v00

查看相关功能的文章

Baidu
map