MATLAB App Designer从入门到实践

978-7-115-57921-8
作者: 苑伟民
译者:
编辑: 李永涛

图书目录:

详情

目前市场上关于GUI设计的书本几乎没有App Designer中各组件的实例介绍,MATLAB的GUIDE在2018年逐渐被被抛弃,不再更新,市面上急需App Designer的书目前市场上关于GUI设计的书本几乎没有App Designer中各组件的实例介绍,MATLAB的GUIDE在2018年逐渐被被抛弃,不再更新,市面上急需App Designer的书目前市场上关于GUI设计的书本几乎没有App Designer中各组件的实例介绍,MATLAB的GUIDE在2018年逐渐被被抛弃,不再更新,市面上急需App Designer的书

图书摘要

版权信息

书名:MATLAB App Designer从入门到实践

ISBN:978-7-115-57921-8

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


编  著 苑伟民

责任编辑 李永涛

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


本书围绕MATLAB中先进的GUI编程工具App Designer为中心进行介绍,在编程基础知识部分介绍了MATLAB的新产品—实时编辑器的使用;在App Designer部分,对App Designer中所有组件,包括21个常用组件、3个容器、3个图窗工具、10个仪器仪表组件、8个航空航天组件,辅以大量实例进行介绍,最后对GUI编写过程中出现的中文乱码问题、数据类型转换、GUI的数据传递、TeX和LaTeX文本解释器进行了专题讨论。全书采用图文并茂的方式进行引导式学习,以期使读者感受到学习编程的快乐。

本书适合想快速入门App Designer的读者,可以作为各大高校的教材或教学辅导书,也可以作为从事生产管理和技术研发等相关工作人员的学习参考手册。


本书作者一直在寻求一种学习MATLAB的方法,让大多数想零基础学习编程的求知者能够快速入门,在确定了编写的主要方向为MATLAB目前较为热门的实时编辑器和App Designer之后,便以此为中心展开编写,以图文并茂的方式讲述这些知识内容。

本书分为3篇12章。第1篇为MATLAB编程基础及初识App Designer,包含2章内容:第1章介绍了MATLAB基础知识,包括M文件(.m)、实时编辑器(.mlx)的使用、编程中的循环及条件语句、变量和常量、数组的创建和操作、调试程序等编程基础内容;第2章概述App Designer工具,包括App Designer组件属性以及如何在画布中添加组件、自定义组件、调整组件和控制组件—编写回调代码。第2篇通过实例对App Designer组件进行介绍,包含6章内容:第3章介绍了App Designer中的常用组件,包括21个常用组件(HTML、下拉列表DropDown、按钮Button、单选按钮组ButtonGroup、切换按钮组ToggleButtonGroup、列表框ListBox、图像Image、坐标区UIAxes、复选框CheckBox、微调器Spinner、文本区域TextArea、日期选择器DatePicker、标签Label、树Tree、树(复选框)Tree、滑块Slider、状态按钮StateButton、编辑字段EditField、数值编辑字段NumericEditField、表UITable、超链接Hyperlink);第4章介绍了3个容器(网格布局管理器GridLayout、选项卡组TabGroup、面板Panel);第5章介绍了3个图窗工具(上下文菜单ContextMenu、工具栏Toolbar、菜单Menu);第6章介绍了10个仪器仪表组件(圆形仪表Gauge、半圆环形仪表Semicircular、90度仪表NinetyDegreeGauge、线性仪表LinearGauge、信号灯Lamp、分档旋钮DiscreteKnob、旋钮Knob、开关Switch、拨动开关ToggleSwitch、跷板开关RockerSwitch);第7章介绍了8个航空航天组件(空速指示仪AirspeedIndicator、海拔测量仪Altimeter、人工地平仪ArtificialHorizon、爬升率指示仪ClimbIndicator、EGT指示仪EGTIndicator、航向指示仪HeadingIndicator、RPM指示仪RPMIndicator、转弯协调仪TurnCoordinator);第8章介绍了App生成可执行文件的方法;每一章节都对每个组件的常用属性进行介绍,辅以编程实例,使用表格、图文结合的方法,让读者能够真正独立建立组件和回调的编程操作。第3篇对GUI编程中的难点问题进行专题分析,包含4章内容:第9章介绍了App Designer和GUI编程中乱码问题的解决方法,第10章介绍了常用的数据类型及数据类型转换,第11章介绍了App Designer和GUI编程中数据传递的方法,第12章介绍了在App Designer和GUI编程中如何使用TeX和LaTeX文本解释器等内容。

此外,在介绍实例的过程中,作者抛弃了xlsread等MATLAB将要停用的Excel读取函数,采用MATLAB推荐的readtable函数,力求通过每一个实例和每一个专题让读者快速掌握基本的使用方法,提高排除问题的能力,达到快速入门并能独立编写软件的水平。在本书编写过程中得到了罗华飞、打浦桥程序员等众多MATLAB爱好者的支持,名字不一一列举,在此一并表示感谢。

由于作者水平有限,知识储备存在片面和不足,书中难免存在一些缺点和错误,欢迎广大读者提出宝贵意见和建议,以便作者进行修正,呈现出更好的内容。作者邮箱:yuanvmin@ hotmail.com。

苑伟民

2021年8月


很高兴苑伟民老师邀请我为他的新书作序。作为MATLAB的铁杆粉丝,使用MATLAB编程来解决科研中的实际问题早已是家常便饭。编程的目的在于化繁为简,用户往往并不关心如何编写代码,而是关心程序所能实现的功能。实现脚本功能封装的最佳途径就是图形化用户界面开发(即GUI开发)。MATLAB GUI开发作为MATLAB编程的重要组成部分,是联系用户与MATLAB代码的桥梁。了解MATLAB GUI开发的读者应该知道,GUIDE是MATLAB的GUI开发的基石,通过它可以搭建出各式各样的应用程序框架,再通过回调函数实现整个应用功能。当然,除了GUIDE外,也可使用uicontrol等UI系列函数实现纯代码的GUI开发。不过随着MATLAB 2016a的发布,全新的应用开发工具App Designer正式面世,同时也宣告了属于GUIDE的时代即将终结!

相较于GUIDE,App Designer有着本质的不同:前者属于面向过程编程,而后者属于面向对象编程;前者基于Java Swing开发,后者则是基于更为开放的Web应用技术开发,如JavaScript、HTML和CSS等,这也使得用App Designer开发的应用更易于Web部署。此外,GUIDE所提供的组件相对单一,功能有限,若要实现高级应用需要较扎实的Java Swing编程功底,而App Designer所提供的组件各式各样,且随着MATLAB的迭代更新,App Designer组件的内容和功能也必将日新月异。

虽然市面上介绍MATLAB编程的书籍琳琅满目,但专注于MATLAB GUI开发的书籍屈指可数,且多半侧重于使用GUIDE来做GUI开发。App Designer作为新版MATLAB应用开发的首推工具,将逐步取代GUIDE。因此,对于想要学习MATLAB应用开发的读者,建议直接学习App Designer。尽管App Designer已面市几年,但系统介绍App Designer开发的专业书籍少之又少,而渴望系统学习App Designer开发的读者与日俱增。为了满足大家的求知欲,让大家能够轻松愉快地搞定App Designer开发,苑伟民老师结合自身多年的MATLAB编程经验及丰富的App Designer实战开发经验汇著成本书。

即便对App Designer有所了解,但从头到尾看完本书后,我顿然有种醍醐灌顶、茅塞顿开的感觉。从MATLAB基础编程到App Designer组件应用,再到专题讨论,案例详实、图文并茂,即便是从未学过MATLAB编程的读者学习本书也不会感到吃力。不过,正如前面所讲,App Designer是面向对象编程,可惜的是书中缺乏MATLAB面向对象编程的相关知识介绍,如果添加,那将是锦上添花的事。

巴山(“matlab爱好者”公众号创始人)

2022年1月1日 于重庆


本篇分为两章内容,主要介绍MATLAB软件编程基础知识与App Designer的界面设计和回调编程等初步知识。第1章介绍了MATLAB基础知识,包括M文件和实时编辑器的使用、编程中的循环及条件语句、变量和常量、数组的创建和操作、调试程序等编程基础内容;第2章概述了App Designer的基本使用方法,包括App Designer组件及如何在画布中添加组件、自定义组件、调整组件和如何编写回调代码。如果读者具备一定的MATLAB编程基础,可以忽略第1章内容,直接进入第2章开始App Designer内容的学习。


MATLAB命令行窗口只能运行一些简单的语句,如果需要重复执行一系列命令或希望将其保存供以后引用,则需要将其存储在程序文件中,如M文件、实时编辑器文件(.mlx)。MATLAB程序的最简单类型是脚本,其中包含一组命令,这些命令与在命令行中键入的命令完全相同。要获得更高的编程灵活性,可以创建接收输入并返回输出的函数。

M文件是MATLAB的基本程序文件,用于执行用户的一系列命令,并输出相应的结果。其中,脚本是最简单的程序文件类型。

可以通过以下两种方法创建新脚本。

(1)单击“主页”选项卡上的“新建”按钮,选择“脚本”(实时脚本),创建一个空的脚本文件,如图1-1和图1-2所示。

图1-1 新建脚本

图1-2 创建空的脚本文件

(2)使用edit函数。例如,edit new_file_name会创建(如果不存在相应文件)并打开new_file_name文件(new_file_name是要定义的文件名,最好按照变量命名法则命名),如图1-3和图1-4所示。如果new_file_name未指定,MATLAB将打开一个名为Untitled的新文件,如图1-5所示。

图1-3 使用edit加文件名创建新的脚本文件

图1-4 使用edit加文件名创建的脚本文件

图1-5 使用edit创建新的脚本文件

其中,方法(2)创建的文件没有存储到电脑磁盘中,运行时,MATLAB会提示保存文件的位置,另存时,可以选择另存为.m或.mlx文件。

创建脚本后,可以向其中添加代码并保存代码。

例如,建立一个求解超越方程的脚本。

syms x
y=x^2*exp(x^2)-10;
x=solve(y,x)
x=vpa(x,20)

保存文件后,单击“运行”按钮或按F5键直接运行,在命令行窗口将会出现运行结果,如图1-6所示。

图1-6 运行结果

可以添加注释来描述代码,以便让其他人理解。要注释所选内容,可选择代码行,转到“编辑器”或“实时编辑器”选项卡,然后单击“”按钮或按“Ctrl+R”组合键;要取消注释所选代码行,可单击“”按钮或按“Ctrl+T”组合键,如图1-7和图1-8所示。

 

图1-7 注释和取消注释代码行工具

图1-8 注释和取消注释代码行

MATLAB的基本程序结构为顺序结构,代码一行一行执行,但是,要完成一个稍微复杂的程序就需要循环及条件语句。MATLAB语言的顺序结构语句关键字见表1-1,循环的终止和控制权的移交关键字见表1-2。

表1-1 顺序结构语句关键字

关键字

含义

if, elseif, else

条件为true时执行语句

for

用来重复指定次数的for循环

parfor

并行for循环

switch, case, otherwise

执行多组语句中的一组

try, catch

执行语句并捕获产生的错误

while

条件为true时重复执行的while循环

表1-2 循环的终止和控制权的移交关键字

关键字

含义

break

终止执行for或while循环

continue

将控制权传递给for或while循环的下一迭代

end

终止代码块或指示最大数组索引

pause

暂时停止执行MATLAB

return

将控制权交还给调用脚本或函数

条件语句可用于在运行时选择要执行的代码块。最简单的条件语句为if语句。例如:

% 产生一个随机数
a = randi(100, 1)
% 如果是偶数,除以2
if rem(a, 2) == 0
    disp('a是个偶数')
    b = a/2;
end

通过使用可选关键字elseif或else,if语句可以包含备用选项。例如:

a = randi(100, 1)
if a < 30
    disp('small')
elseif a < 80
    disp('medium')
else
    disp('large')
end

再者,当希望针对一组已知值测试相等性时,可使用switch语句。例如:

[dayNum, dayString] = weekday(date, 'long', 'local')
switch dayString
    case 'Monday'
        disp('Start of the work week')
    case 'Tuesday'
        disp('Day 2')
    case 'Wednesday'
        disp('Day 3')
    case 'Thursday'
        disp('Day 4')
    case 'Friday'
        disp('Last day of the work week')
    otherwise
        disp('Weekend!')
end

1.2.1.1 if, elseif, else语句

if, elseif, else语句,条件为true时执行代码。

1.语法

if expression
    statements
elseif expression
    statements
else
    statements
end

2.说明

if expression, statements, end计算表达式,并在表达式为true时执行一组语句。当表达式的结果非空并且仅包含非零元素(逻辑值或实数值)时,该表达式为true;否则,表达式为false。

elseif和else模块是可选的。这些语句仅在if...end块中前面的表达式的结果为false时才会执行。if块可以包含多个elseif块。

3.详细信息

表达式可以包含关系运算符(如<或==)和逻辑运算符(如&&、||或~)。可使用逻辑运算符and和or创建复合表达式。MATLAB按照运算符优先级规则从左至右计算复合表达式。

在if...end块的条件表达式内,逻辑运算符&和 | 的行为与短路运算符的行为相同。它们分别相当于&&和 ||。由于&&和 || 在条件表达式和语句中一致短路,因此,建议在表达式中使用&&和 ||,而不是&和 |。例如:

x = 42;
if (5>6) && (myfunction(x) >= pi)
    disp('Expressions are true')
end

表达式的第一部分的计算结果为false。因此,MATLAB不需要计算表达式的第二部分,否则会导致未定义的函数错误。

4.提示

(1)可以嵌套任意数量的if语句。每个if语句需要一个end关键字。

(2)elseif的“else”和“if”之间不应有空格,否则会创建嵌套的if语句,该语句需要搭配独立的end关键字。

要确定运行时所执行的代码块,除if语句外还可以使用switch条件语句。

5.示例

(1)使用if、elseif和else指定条件。

最简单的条件语句为if…end语句。例如:

% 产生随机数
a = randi(100, 1);
% 如果是偶数就取半
if rem(a, 2) == 0
    disp('a is even')
    b = a/2;
end

通过使用可选关键字elseif或else,if语句可以包含备用选项。例如:

a = randi(100, 1);
if a < 30
    disp('small')
elseif a < 80
    disp('medium')
else
    disp('large')
end

(2)比较数组。

数组进行关系运算时,表达式(例如A>0)仅在结果中的每个元素都大于零时才为true。

下面的示例使用any函数测试是否有任意结果为true。

limit = 0.75;
A = rand(10,1)%产生10行1列的随机数
A = 10×1
    0.8147
    0.9058
    0.1270
    0.9134
    0.6324
    0.0975
    0.2785
    0.5469
    0.9575
    0.9649
if any(A > limit)
    disp('至少有一个值超出0.75。')
else
    disp('所有值都小于0.75。')
end

输出结果为:

至少有一个值超出0.75。

(3)测试数组的相等性。

使用isequal而不是==运算符比较数组来测试相等性,因为当数组的大小不同时,==会导致错误。

下面给出了比较两个数组的示例。

A = ones(2,3);%生成2行3列的1矩阵

B = rand(3,2);%生成一个由介于0和1之间的均匀分布的随机数组成的3行2列的数字矩阵

如果size(A)与size(B)相同,则会串联这两个数组,否则显示一条警告并返回一个空数组。

if isequal(size(A),size(B))
   C = [A; B];
else
   disp('数组A和B的大小不同。')
   C = [];
end

输出结果为:数组A和B的大小不同。

(4)比较字符向量。

MATLAB内部使用strcmp比较字符向量。当字符向量的大小不同时,使用==测试相等性会产生错误。

a='MAT';
b='LAB';
if (a==b)
    disp('字符a和b相同。')
else
    disp('字符a和b不相同。')
end

输出结果为:字符a和b不相同。

(5)评估表达式中的多个条件。

确定值是否在指定范围内。

x = 10;
minVal = 2;
maxVal = 6;
if (x >= minVal) && (x <= maxVal)
    disp('x的值介于2和6之间。')
elseif (x > maxVal)
    disp('x的值大于6。')
else
    disp('x的值小于2。')
end

输出结果为:

x的值大于6。

1.2.1.2 switch, case, otherwise语句

switch, case, otherwise语句用于执行多组语句中的一组。

1.语法

switch switch_expression
    case case_expression
        statements
    case case_expression
        statements
        ...
    otherwise
    statements
end

2.说明

switch switch_expression, case case_expression, end计算表达式,并选择执行多组语句中的一组。每个选项为一个case。

switch块会测试每个case,直至一个case表达式为true。case在以下情况下为true。

(1)对于数字,case_expression == switch_expression。

(2)对于字符向量,strcmp(case_expression,switch_expression) == 1。

(3)对于支持eq函数的对象,case_expression==switch_expression,重载的eq函数的输出必须为逻辑值或可转换为逻辑值。

(4)对于元胞数组case_expression,元胞数组的至少一个元素与switch_expression匹配,如上述对数字、字符向量和对象的定义。

当case表达式为true时,MATLAB执行对应的语句,然后退出switch块。

这里的switch_expression必须为标量或字符向量。case_expression必须为标量、字符向量或标量,或者字符向量元胞数组。

otherwise块是可选的。仅当没有case为true时,MATLAB才会执行这些语句。

3.提示

(1)case_expression不能包含关系运算符(例如“或”运算符)来与switch_expression进行比较。要测试不相等性,可使用if, elseif ,else语句。

(2)MATLAB的switch语句不会像C语言的switch语句一样失效。如果第一个case语句为true,则MATLAB不会执行其他case语句。例如:

result = 52;
switch(result)
    case 52
        disp('result is 52')
    case {52, 78}
        disp('result is 52 or 78')
end
result is 52

(3)在该case内定义特定case中的代码所需要的变量。由于MATLAB仅执行任何switch语句的一个case,因此一个case内定义的变量不适用于其他case。例如,如果当前工作区不包含变量x,则仅定义x的情况可以使用以下方法。

switch choice
    case 1
        x = -pi:0.01:pi;
    case 2
        % does not know anything about x
end

(4)MATLAB的break语句会结束for或while循环的执行,但不结束switch语句的执行。此行为不同于C语言中break和switch的行为。

(5)对于if和switch,MATLAB执行与第一个表达式结果为true的条件相应的代码,然后退出该代码块。每个条件语句都需要end关键字。

一般而言,如果具有多个可能的离散已知值,读取switch语句比读取if语句更容易。但是,无法测试switch和case值之间的不相等性。例如,无法使用switch实现以下类型的条件。

yourNumber = input('Enter a number: ');
if yourNumber < 0
    disp('Negative')
elseif yourNumber > 0
    disp('Positive')
else
    disp('Zero')
end

4.示例

(1)比较单个值。

根据在命令提示符下输入的值,有条件地显示不同的文本。

n = input('Enter a number: ');
switch n
    case -1
        disp('negative one')
    case 0
        disp('zero')
    case 1
        disp('positive one')
    otherwise
        disp('other value')
end

在命令提示符下,输入数字1,返回结果“positive one”。

重复执行该代码并输入数字3,返回结果“other value”。

(2)与多个值进行比较。

根据输入的月份判断季节,如果输入3、4、5中的任何一个值,则显示春季,其他季节类似。创建包含3个值的元胞数组。

month=3;
switch month
    case {3,4,5}
        season='春季'
    case {6,7,8}
        season='夏季'
    case {9,10,11}
        season='秋季'
    otherwise
        season='冬季'        
end

通过循环控制语句,可以重复执行代码块。循环有两种类型。

(1)for语句。循环特定次数,并通过递增的索引变量跟踪每次迭代。

例如,预分配一个2元素向量并计算5个值。

x = ones(1,2)
for n = 1:4
    x(n+1) = 2 * x(n)
end

(2)while语句。只要条件仍然为true就进行循环。

例如,计算5的阶乘。

a=5;
n=1;
nFactorial = 1;
while n <= a
    nFactorial = nFactorial * n
    n = n + 1;
end

1.2.2.1 for语句

用来重复指定次数的for循环。

1.语法

for index = values
    statements
end

2.说明

在循环中将一组语句执行特定次数。values为下列形式之一。

(1)initVal:endVal。index从initVal至endVal按1递增,重复执行statements,直到index大于endVal。

(2)initVal:step:endVal。每次迭代时,index按值step递增,或在step是负数时递减。

(3)valArray。每次迭代时从数组valArray的后续列创建列向量index。例如,在第一次迭代时,index=valArray(:,1)。循环最多执行n次,其中n是valArray的列数,由numel(valArray (1,:))给定。输入的valArray可属于任何MATLAB数据类型,包括字符向量、元胞数组或结构体。

3.提示

(1)要以编程方式退出循环,可使用break语句。要跳过循环中的其余指令,并开始下一次迭代,可使用continue语句。

(2)避免在循环语句内对index变量赋值。for语句会覆盖循环中对index所做的任何更改。

(3)要对单列向量的值进行迭代,应首先将其转置,以创建一个行向量。

(4)每个循环都需要end关键字。

(5)最好对循环进行缩进处理,以便于阅读,特别是使用嵌套循环时(即一个循环包含另一个循环)。

A = zeros(5,100);
for m = 1:5
    for n = 1:100
        A(m, n) = 1/(m + n - 1);
    end
end

可以通过选中所有代码,使用实时编辑器的智能功能一键设置缩进,见图1-9。

图1-9 智能缩进语句

实时编辑器的基本用法和M文件用法一致。

(6)如果意外创建了一个无限循环(永远不会自行结束的循环),可按“Ctrl+C”组合键停止执行循环。

4.示例

(1)计算数值。

a=10;
for b = 1
    a+b
end

(2)步长递增或者递减值。

以0.7为步长递增,计算正弦函数的值。

a= 10;
for b = 1:0.7:a
    d=sin(b);
end

以0.7为步长递减,计算正弦函数的值。

a= 10;
for b = a:-0.7:1
    c=sin(b);
end

(3)执行指定值的语句。

for v = [1 5 8 17]
    disp(v)
end
     1
     5
     8
     17

(4)对每个矩阵列重复执行语句。

for I = eye(4,3)
    disp('Current unit vector:')
    disp(I)
end
Current unit vector:
     1
     0
     0
     0
Current unit vector:
     0
     1
     0
     0
Current unit vector:
     0
     0
     1
     0

1.2.2.2 while语句

条件为true时重复执行的while循环。

1.语法

while expression
    statements
end

2.说明

while expression, statements,end计算一个表达式,并在该表达式为true时在一个循环中重复执行一组语句。表达式的结果非空并且仅包含非零元素(逻辑值或实数值)时,该表达式为true;否则,该表达式为false。

3.详细信息

表达式可以包含关系运算符(如<或==)和逻辑运算符(如&&、||或~)。使用逻辑运算符“和”和“或”创建复合表达式。MATLAB按照运算符优先级规则从左至右计算复合表达式。

在while...end块的条件表达式中,逻辑运算符&和 | 的行为方式和短路运算符一样,分别相当于&&和 || 的行为。由于&&和 || 在条件表达式和语句中一致短路,因此,建议在该表达式中使用&&和 ||,而不是&和 |。例如:

x = 5;
while (x<1) && (exp(x) >= pi)  
    disp('Expressions are true')
    break    
end

表达式的第一部分的计算结果为false。因此,MATLAB不需要计算表达式的第二部分,否则会导致未定义的函数错误。

4.提示

(1)如果意外创建了一个无限循环(即永远不会自行结束的循环),可按“Ctrl+C”组合键停止执行循环。

(2)如果条件表达式的计算结果是一个矩阵,则仅当该矩阵中的所有元素都为true(非零)时,MATLAB才会计算这些语句。要在任意元素为true时执行语句,可在any函数中为表达式换行。

(3)要以编程方式退出循环,可使用break语句。要跳过循环中的其余指令,并开始下一次迭代,可使用continue语句。

(4)嵌套许多while语句时,每个while语句都需要一个end关键字。

5.示例

(1)重复执行语句,直到表达式为false。

使用while循环计算10的阶乘factorial(10)。

n = 10;
f = n;
while n > 1
    n = n-1;
    f = f*n;
end
disp(['n! = ' num2str(f)])

输出结果:

n! = 3628800

(2)跳至下一迭代。

使用continue语句跳过小于等于15的值,执行16到20的循环,开始下一迭代。

a = 1;b=3.14;
while a < 20
    a = a + 1;
    if a <= 15
        continue;%当a小于等于15时候不执行
    end
    b=b+1;
    fprintf('value of a : %d\n', a);
    fprintf('value of b : %d\n', b);
end

输出结果为:

value of a : 16
value of b : 4.140000e+00
value of a : 17
value of b : 5.140000e+00
value of a : 18
value of b : 6.140000e+00
value of a : 19
value of b : 7.140000e+00
value of a : 20
value of b : 8.140000e+00

(3)在表达式为false之前退出循环。

求随机数序列之和,直到下一随机数大于上限为止。然后,使用break语句退出循环。

limit = 0.8;
s = 0;
while 1
    tmp = rand
    if tmp > limit
        break  %如果随机数rand大于0.8则不执行s = s + tmp语句
    end
    s = s + tmp
end

continue可以将控制权传递给for或while循环的下一迭代。

1.语法

continue

2.说明

continue将控制权传递到for或while循环的下一迭代,它会跳过当前迭代的循环体中剩余的任何语句,程序继续从下一迭代执行。

continue仅在调用它的循环的主体中起作用。在嵌套循环中,continue仅跳过所在的循环体内的剩余语句。

3.提示

continue语句跳过当前for或while循环中剩余的语句,并开始下一迭代。要完全退出循环,可使用break语句。

要退出函数,请使用return语句。

4.示例

显示从1到50的整数中的7的倍数。如果数字不能被7整除,可使用continue跳过disp语句,并将控制权传递到for循环的下个迭代中。

for n = 1:50
    if mod(n,7)
        continue
    end
    disp(['Divisible by 7: ' num2str(n)])
end
Divisible by 7: 7
Divisible by 7: 14
Divisible by 7: 21
Divisible by 7: 28
Divisible by 7: 35
Divisible by 7: 42
Divisible by 7: 49

MATLAB的break可以终止执行for或while循环。

1.语法

break

2.说明

关键字break用于终止执行for或while循环。不执行循环中在break语句之后显示的语句。

在嵌套循环中,break仅退出它所在的循环,控制传递给该循环的end之后的语句。

3.提示

break语句完全退出for或while循环。要跳过循环中的其余指令,并开始下一次迭代,可使用continue语句。

break不是在for或while循环之外定义的。要退出函数,可使用return语句。

4.示例

求随机数序列之和,直到下一随机数大于上限为止。然后,使用break语句退出循环。

limit = 0.8;
s = 0;
while 1
    tmp = rand;
    if tmp > limit
        break
    end
    s = s + tmp
end

MATLAB的return可以将控制权交还给调用脚本或函数。

1.语法

return

2.说明

return强制MATLAB在到达调用脚本或函数的末尾前将控制权交还给调用程序。调用程序指的是调用包含return调用的脚本或函数的某脚本或函数。如果直接调用包含return的脚本或函数,则不存在调用程序,MATLAB将控制权交还给命令提示符。


注意

在条件块(例如if或switch)或循环控制语句(例如for或while)使用return时需要小心。当MATLAB到达return语句时,它并不仅会退出循环,还会退出脚本或函数,并将控制权交还给调用程序或命令提示符。


3.示例

(1)将控制权返回给键盘。

在当前工作文件夹中,创建函数findSqrRootIndex,以在数组中第一次出现给定值的平方根时,返回其索引值。如果未求出平方根,则该函数返回NaN。

function idx = findSqrRootIndex(target,arrayToSearch)
idx = NaN;
if target < 0
   return
end

for idx = 1:length(arrayToSearch)
    if arrayToSearch(idx) == sqrt(target)
        return
    end
end

在命令提示符下调用该函数。

A = [3 7 28 14 42 9 0];
b = 81;
findSqrRootIndex(b,A)
ans =     6

当MATLAB遇到return语句时,它将控制权交还给键盘,因为没有调用脚本或函数。

(2)将控制权返回给调用函数。

在当前工作文件夹下的文件returnControlExample.m中,创建以下函数,以在数组中第一次出现给定值的平方根时,返回其索引值。此函数调用在前一示例中创建的findSqrRootIndex函数。

function returnControlExample(target)
    arrayToSearch = [3 7 28 14 42 9 0];
    idx = findSqrRootIndex(target,arrayToSearch);

    if isnan(idx)
        disp('Square root not found.')
    else
        disp(['Square root found at index ' num2str(idx)])
    end
end

在命令提示符下调用该函数。

returnControlExample(49)
Square root found at index 2

当MATLAB在findSqrRootIndex中遇到return语句时,它将控制权返回给调用函数returnControlExample并显示相关消息。

MATLAB需要对变量进行命名,其变量命名规则有以下几种。

(1)变量名必须以字母开头,可以包含字母(区分大写、小写)、数字、下划线中的任意一种或几种(字母开头,搭配数字、下划线)。如,P_0和p_0是两个不同的变量。

(2)变量名的最大长度为63个字符,超过的部分将被忽略。在命令窗口输入函数namelengthmax,可以返回变量名的字符数。

(3)不要求对所使用的变量进行事先声明(方程的未知量需要声明),也不需要指定变量类型(方程的结果需要指定类型,避免在GUI操作中出错),MATLAB会自动根据赋予变量的值或对变量进行的操作来确定变量的类型。

(4)不要与内置函数或者常量重名,尽量避免使用函数名作为变量名。

(5)某些常量也可以作为变量使用,如i、j在MATLAB中表示虚数单位,但也可以作为变量使用。

表1-3给出了变量操作的常用函数,可以在命令行窗口使用“help+空格+函数名”来查询具体使用方法。

表1-3 变量操作的常用函数

函数名 说明 语法 示例
isvarname 确定输入字符串是
否有效的变量名称
isvarname s是命令形式的语法。命令形式需要的特殊字符更少,不需要用括号或单引号将输入引起来,s是潜在的变量名称,指定为字符向量或字符串 >> isvarname column_8
ans =
 logical
  1
matlab.lang.
makeValidName
根据输入字符串构造有效的MATLAB标识符 N=matlab.lang.makeValidName(S)根据输入字符串S构造有效的MATLAB标识符N。makeValidName函数并不保证N中的字符串是唯一的 >>S={'Item_#','Price/
Unit','1st order','Contact'};
N=matlab.lang.
makeValidName(S)
N=
 1×4 cell数组
{'Item__'}{'Price_Unit'}  {'x1stOrder'}{'Contact'}
在第一个和第二个元素中,makeValidName将无效字符(#和/)替换为下划线。在第三个元素中,makeValidName添加了一个前缀(因为该字符向量不是以字母开头),删除了空格,并将删除的空格后面的字符更改为大写
exist 检查变量、脚本、函数、文件夹或类的存在情况 exist name以数字形式返回name的类型。返回0表示name不存在或因其他原因找不到,例如,如果name存在于MATLAB不能访问的受限文件夹中,exist将返回0;返回1表示name是工作区中的变量;返回5表示name是MATLAB内置函数,不包括类 检查plot函数是内置函数还是文件
>> A = exist('plot')
A=5
这表明plot是一个MATL AB内置函数
who 列出工作区中的变量 who按字母顺序列出当前活动工作区中的所有变量的名称。
who -file filename列出指定的MAT文件中的变量名称。
who -var1...varN只列出指定的变量。此语法与先前语法中的任意一个参数结合使用。
who global列出全局工作区中的变量名称
列出当前工作区中以字母a开头的变量的名称:
>> who a*
显示当前工作区中以ion结尾的变量的名称:
>> who -regexp ion$
whos 列出工作区中的变量的名称、大小和类型 whos按字母顺序列出当前活动工作区中的所有变量的名称、大小和类型。
whos -file filename列出指定的MAT文件中变量的信息。
whos global列出全局工作区中变量的信息
显示当前工作区中特定变量的信息。例如,列出名称以字母a开头的变量的相关信息:
>> whos a*
现在,列出名称以ion结尾的变量的相关信息:
>> whos -regexp ion$
clear 从工作区中删除项目,释放系统内存 clear从当前工作区中删除所有变量,并将它们从系统内存中释放。
clear name1...nameN删除内存中的变量、脚本、函数或MEX函数name1... name N。
提示:
调用clear all、clear classes和clear functions会降低代码性能,且通常没有必要。
要从当前工作区中清除一个或多个特定变量,可使用clearname1... name N。
要清除当前工作区中的所有变量,可使用clear或clearvars。
定义两个变量a和b,然后清除a:
>> a = 1;b = 2;clear a
仅变量b保留在工作区中
clear 从工作区中删除项目,释放系统内存 要清除所有全局变量,可使用clear global或clearvars -global。要清除特定类,可使用clearmyClass。要清除特定函数或脚本,可使用clear functionName。
要清除所有MEX函数,可使用clear mex。
clear函数可以删除指定的变量。要删除除几个指定变量之外的所有变量,可改用clearvars。
如果清除图窗或图形对象的句柄,该对象自身将不会被删除。可使用delete删除对象。另外,删除对象并不会删除用于存储其句柄的变量(如果有)。
clear函数不会清除Simulink模型。可改用bdclose。
clear函数不会清除局部函数或嵌套函数中的持久变量
定义两个变量a和b,然后清除a:
>> a = 1;b = 2;clear a
仅变量b保留在工作区中
clearvars 清除内存中的变量 clearvars删除当前活动工作区中的所有变量。
clearvars variables删除variables指定的变量。如果任何变量为全局变量,则clearvars将仅从当前工作区中删除这些变量,并保留可供将其声明为全局变量的任何函数访问。
clearvars -except keepVariables删除除keepVariables指定的变量之外的所有变量。使用此语法保留特定的变量并删除所有其他变量。
clearvars variables -except keepVariables删除variables指定的变量,但不删除keepVariables指定的变量。此语法允许将变量名称、通配符或正则表达式结合使用来指定要删除或保留的变量
(1)清除命名变量。定义3个变量,即
a、b和c,然后清除
a和c:
>>a = 1;b = 2;c = 3;clear vars a c
仅变量b保留在工作区中。
(2)清除除指定变量之外的所有变量。
删除工作区中除变量C和D外的所有变量:
>>clearvars -except C D
(3)使用正则表达式清除变量和命名要排除的变量。清除名称以b开头且后面跟着3个数字的变量,但变量b106除外。
>>clearvars-regexp ^b\d{3}$ -except b106

根据变量的作用域,可以将变量分为局部变量和全局变量。通常每个函数均有各自的局部变量,这些局部变量与其他函数的局部变量和基础工作区的局部变量是分开的。但是,如果多个函数都将特定的变量名称声明为global,则它们共享该变量的一个副本。如果在任何函数中对该变量的值做任何更改,那么其在该变量声明为全局变量的所有函数中都是可见的。

局部变量:在函数(或循环体)内有效,当该函数(或者循环)执行完毕,该变量在当前工作空间被存储(或者被新的数据替代)。

全局变量:可以在不同的函数工作空间和基本工作空间中共享,其语法如下。

global var1 ... varN

该语法表示:将变量var1...varN声明为作用域中的全局变量。每个变量间用空格间隔。

如果当前工作区中已经存在与全局变量具有相同名称的变量,则MATLAB会发出警告。


提示

为了便于修改和检查代码,建议将全局变量的定义放在函数体前面。


MATLAB中预先定义了数值的变量,被称为常量。部分默认常量见表1-4。

表1-4 默认常量

名称

说明

pi

圆的周长与其直径的比率。
以双精度形式返回π值,小数点后有15位。
示例:
>>format long;p = pi
p = 3.141592653589793

eps

浮点相对精度,MATLAB计算时的容许误差

nargin

函数输入参数的数目

realmin

最小标准浮点数。返回IEEE双精度形式的最小标准正浮点数。
示例:
>>f = realmin('single')
f = single
  1.1755e-38

Inf

当运算结果太大以至于无法表示为浮点数时,如1/0或log(0),运算会返回Inf

lastwarn

返回由MATLAB软件生成的最后一条警告消息,无论警告的显示状态是什么。
示例:
>> lastwarn
ans =
 空的0×0 char数组

computer

有关运行MATLAB的计算机的信息。
示例:
>> computer
ans =
  'PCWIN64'

NaT

非时间(Not-a-Time)

ans

最近计算的答案。在未指定输出参数的情况下运行返回输出的MATLAB代码,MATLAB会创建ans变量并将要输出的值存储在该变量中。建议不要在脚本或函数中更改或使用ans的值,因为该值可能会经常变化

i,j

虚数单位,i等效于根号-1的值

nargout

函数输出参数的数目

realmax

最大的正浮点数。将输出格式设置为长科学记数法。返回IEEE双精度形式的最大有限浮点数。
示例:
>>format long e;f = realmax
f = 1.797693134862316e+308

NaN

Not a Number同NaN。如果运算有未定义的数值结果,如0/0或0*Inf,则运算返回NaN

lasterr

返回MATLAB软件生成的最后一条错误消息。
示例:
>> lasterr
ans =
  '函数或变量'realman'无法识别。'

version

MATLAB的版本号和库。
示例:
>> version
ans =
  '9.10.0.1649659 (R2021a) Update 1'

MATLAB中一般使用英文的一对方括号“[ ]”、逗号“,”、空格“ ”和分号“;”来创建数组,数组中同一行的元素使用英文逗号或者空格进行分隔,不同行之间用分号进行分隔。

1.通过冒号来创建一维数组

X=A:step:B

X为要创建的数组,A为数组的第一个元素的值,B为数组最后一个元素的值,step为步长。

>> x=1:1:5
x =
     1     2     3     4     5

步长为1时可以不写步长:

>> x=1:5

x =
     1     2     3     4     5
>> x=2:pi:9

x =
    2.0000    5.1416    8.2832

2.通过linspace函数创建一维数组

(1)y = linspace(x1,x2)返回包含x1和x2之间的100个等间距点的行向量。

(2)y = linspace(x1,x2,n)生成n个点。这些点的间距为(x2-x1)/(n-1)。

>> y1 = linspace(-5,5,5)

y1 =
   -5.0000   -2.5000    0    2.5000    5.0000

linspace类似于冒号运算符“:”,但可以直接控制点数并始终包括端点。“linspace”名称中的“lin”指示生成线性间距点的值,而同级函数logspace会生成对数间距点的值。关于logspace的用法,可参阅帮助文件(在命令行窗口输入“help logspace”)。

3.使用逗号、空格、分号创建矩阵

在命令窗口输入含有5个元素的行向量和含有5个元素的列向量。

在命令行输入以下语句。

>> A=[1 2 3 4 5]            %行向量
B=[0.1,0.2,0.3,0.4,0.5]    %行向量
C=[9;8;7;6;5;4]            %列向量
以下为输出:
A =
     1     2     3     4     5
B =
    0.1000    0.2000    0.3000    0.4000    0.5000
C =
     9
     8
     7
     6
     5
     4

从输出结果来看,用空格和逗号创建矩阵,效果一样。


提示

要在命令行窗口输入多行语句,每输入一行,按“Shift+Enter”组合键可以实现换行;输入完毕后,按Enter键,执行输入的命令。


1.通过冒号“:”和逗号“,”来查询操作数组

(1)创建一个3×3维数组。

>> A=[1:3;4:6;7:9]

A =
     1     2     3
     4     5     6
     7     8     9

(2)查询所有行和所有列的数据。

>> A(:,:)

ans =
     1     2     3
     4     5     6
     7     8     9

(3)查询第1行的数据。

>> A(1,:)

ans =
     1     2     3

(4)查询第1列的数据。

>> A(:,1)

ans =
     1
     4
     7

(5)将数组元素从第一个到最后一个按照顺序输出。

>> A(1:end)

ans =
     1     4     7     2     5     8     3     6     9

(6)将数组元素从最后一个到第一个反序输出。

>> A(end:-1:1)

ans =
     9     6     3     8     5     2     7     4     1

(7)查询第6、7、3位的数据。

>> A(6)

ans =
     8

>> A(7)

ans =
     3
>> A(3)
ans =
     7

(8)查询第1行的第3个数据。

>> A(1,3)
ans =
     3

(9)查询第2行的第3个数据。

>> A(2,3)

ans =
     6

2.通过赋值进行元素替换

(1)把第2行的第3个元素替换为0。

>> A(2,3)=0

A =
     1     2     3
     4     5     0
     7     8     9

(2)把第2行的所有元素替换为0。

>> A(2,:)=0

A =
     1     2     3
     0     0     0
     7     8     9

(3)将第3、6、9个元素替换为4、5、6。

>> A([3 6 9])=[4 5 6]
A =
     1     2     3
     0     0     0
     4     5     6

MATLAB运算符包括算术运算符、关系运算符和逻辑运算符,在编程中经常用到。下面以列表形式介绍各种符号。

算术运算符如表1-5所示。

表1-5 算术运算符

符号

功能

函数

说明及示例

+

加法

plus

C=A+B。将数组A和B相加,方法是将对应元素相加。A和B的大小必须相同或兼容。A、B可以是单个数字。
示例:
>> 2+3
ans =
   5

+

一元加法

uplus

C=+A。返回数组A,并将其存储在C中,替换C中的数字。该功能在数值计算中并无实际作用,可以理解为为A添加正号。
示例:
>> a=3;b=4;b=+a
b =
   3

减法

minus

C = A−B。从A数组中减去B数组,方法是将对应元素相减。A和B的大小必须相同或兼容。
示例:
>> 2−3
ans =
  −1

一元减法

uminus

C =−A。对A的各个元素求反,然后将结果存储在C中。可以理解为为A添加负号。
示例:
>> a=2b=−a
b=
  −2

.*

按元素乘法

times

C = A.*B。对数值A和B做按元素乘法,方法是将对应的元素相乘。A和B的大小必须相同或兼容。这种乘法又称为点乘。
示例:
>> A = [1 0 3];
B = [2 3 7];
C = A.*B
C =
   2   0  21

*

矩阵乘法

mtimes

C=A*B。C是A和B的矩阵乘积。如果A是m×p矩阵,B是p×n矩阵,则C是m×n矩阵,C(i,j)=A(i,:)*B(:,j),C(i,j)是A第i行与B第j列的内积

./

按元素右除

rdivide

x=A./B。用A的每个元素除以B的对应元素。A和B的大小必须相同或兼容。这种除法又称为点除。
示例:
>>3./5
ans=
  0.6000
>> A=[1 2 3];B=[4 5 6];A./B
ans =
  0.2500  0.4000  0.5000

/

矩阵右除

mrdivide

x=B/A。对线性方程组x*A=B求解x。矩阵A和B必须具有相同的列数。
如果A是标量,那么B/A等于B./A。
如果A是n×n方阵,B是n列矩阵,那么x=B/A是方程x*A=B的解(如果存在解的话)。
如果A是矩形m×n矩阵,且m~=n,B是n列矩阵,那么x=B/A返回方程组x*A=B的最小二乘解

.\

按元素左除

ldivide

x=B.\A。用A的每个元素除以B的对应元素。A和B的大小必须相同或兼容。该功能很少使用,这里不做介绍

\

矩阵左除

mldivide

x=A\B。对线性方程组A*x=B求解。矩阵A和B必须具有相同的行数。
如果A是标量,那么A\B等于A.\B。
如果A是n×n方阵,B是n行矩阵,那么x=A\B是方程A*x=B的解(如果存在解的话)。
如果A是矩形m×n矩阵,且m~=n,B是m行矩阵,那么A\B返回方程组A*x=B的最小二乘解

.^

按元素求幂

power

C=A.^B。以A中的每个元素为底数,以B中的对应元素为指数求幂。A和B的大小必须相同或兼容。
示例:
>>2.^3
ans =
   8
>> A=[1 2 3];B=[4 5 6];B.^A
ans =
   4  25  216

^

矩阵幂

mpower

C=A^B。计算A的B次幂并将结果返回给C。A和B必须满足下列条件之一:①底数A是方阵,指数B是标量。如果B为正整数,则按重复平方计算幂。对于B的其他值,计算包含特征值和特征向量;②底数A是标量,指数B是方阵,该计算涉及特征值和特征向量。
示例:
>> B = [0 1; 1 0];C = 2^B
C =
  1.2500  0.7500
  0.7500  1.2500
>> A = [1 2; 3 4];C = A^2
C =
   7  10
  15  22

.'

转置

transpose

B=A.'。返回A的非共轭转置,即每个元素的行和列索引都会互换。如果A包含复数元素,则A.'不会影响虚部符号。例如,如果A(3,2)是1+2i且B=A.',则元素B(2,3)也是1+2i

'

复共轭转置

ctranspose

示例:
>> A = [2 1; 9 7; 2 8; 3 5]
B = A'
A =
   2   1
   9   7
   2   8
   3   5
B =
   2   9   2   3
   1   7   8   5

关系运算符如表1-6所示。

表1-6 关系运算符

符号

功能

操作符

说明

==

等于

eq

当数组A和B相等时,A= =B返回一个逻辑数组,其各元素均为逻辑值1(true);否则,元素为逻辑值0(false)。该运算将比较数值数组的实部和虚部。当A或B含有NaN或未定义的分类元素时,eq返回逻辑值0(false)

~=

不等于

ne

A~=B返回一个逻辑数组,当数组A和B不相等时,其对应位置上的元素为逻辑值1(true),否则为逻辑值0(false)。该运算将比较数值数组的实部和虚部。

~=

不等于

ne

当A或B含有NaN或未定义的分类元素时,ne返回逻辑值1(true)

>

大于

gt

A>B返回一个元素为逻辑值1(true)的逻辑数组,否则,元素为逻辑值0 (false)。该运算仅比较数值数组的实部。如果A或B包含NaN或未定义的分类元素,则gt返回逻辑值0(false)

>=

大于或等于

ge

A>=B返回一个逻辑数组,当A大于或等于B时,其对应位置的元素为逻辑值1(true),否则为逻辑值0(false)。该运算仅比较数值数组的实部。如果A或B包含NaN或未定义的分类元素,则ge返回逻辑值0(false)

<

小于

lt

A<B返回一个逻辑数组,当A小于B时,其对应位置的元素为逻辑值1(true),否则为逻辑值0(false)。该运算仅比较数值数组的实部。如果A或B包含NaN或未定义的分类元素,则lt返回逻辑值0(false)

<=

小于或等于

le

A<=B返回一个逻辑数组,当A小于或等于B时,其对应位置的元素为逻辑值1(true),否则为逻辑值0(false)。该运算仅比较数值数组的实部。如果A或B包含NaN或未定义的分类元素,则le返回逻辑值0(false)

逻辑运算符如表1-7所示。

表1-7 逻辑运算符

符号 功能 更多信息 说明
& 逻辑AND and A&B对数组A和B执行逻辑AND操作,并返回包含逻辑值1(true)或逻辑值0(false)的元素的数组。如果A和B在相同的数组位置都包含非零元素,则输出数组中对应位置的元素将设置为逻辑值1(true)。如果不是,则将数组元素设置为0
| 逻辑OR or A|B对数组A和B执行逻辑OR操作,并返回包含设置为逻辑值1(true)或逻辑值0(false)的元素的数组。如果A或B中相同位置元素存在非零元素,则输出数组中对应元素为逻辑值1(true);如果不是,则对应元素为逻辑值0(false)
&& 逻辑AND(具有短路功能) Logical Operators: Short-Circuit && || expr1 && expr2表示使用短路行为的逻辑AND运算。即如果expr1为逻辑值0(false),将不计算expr2的结果。每个表达式的计算结果都必须为标量逻辑值
|| 逻辑OR(具有短路功能) expr1 || expr2表示使用短路行为的逻辑OR运算。即如果expr1为逻辑值1(true),将不计算expr2的结果。每个表达式的计算结果都必须为标量逻辑值
逻辑非 not ~A返回与A大小相同的逻辑数组。如果A中某元
素为零值,则数组中对应元素为逻辑值1(true);如
果A中某元素为非零值,则数组中对应元素为逻辑
值0(false)


注意

本书约定书写数字向量(单个数字,非矩阵)指数幂时用符号^或者.^来表示,如6^2、6.^2均表示6的2次方。


使用算术运算符、关系运算符和逻辑运算符的任意组合来进行运算时,需要通过其优先级来确定计算表达式时的运算顺序。处于同一优先级的运算符具有相同的运算优先级,将从左至右依次进行计算。下面给出了MATLAB运算符的优先级规则,从最高优先级到最低优先级依次排列如下。

(1)括号()。

(2)转置(.')、按元素求幂(.^)、复共轭转置(')、矩阵幂(^)。

(3)带一元减法(.^−)、一元加法(.^+)和逻辑非(.^~)的幂,以及带一元减法(^−)、一元加法(^+)或逻辑求反(^~)的矩阵幂。


注意

尽管大多数运算符都从左至右参与计算,但(^−)、(.^−)、(^+)、(.^+)、(^~)和(.^~)按从右至左的顺序参与计算,如2.^−2,即−2的平方,先求平方后进行倒数,2.^−2=0.2500。建议使用括号显式指定包含这些运算符组合的语句的期望优先级。


(4)一元加法(+)、一元减法(−)、逻辑非(~)。

(5)按元素乘法(.*)、按元素右除(./)、按元素左除(.\)、矩阵乘法(*)、矩阵右除(/)、矩阵左除(\)。

(6)加法(+)、减法(−)。

(7)冒号运算符(:)。

(8)小于(<)、小于或等于(<=)、大于(>)、大于或等于(>=)、等于(==)、不等于(~=)。

(9)逻辑AND(&)。

(10)逻辑OR(|)。

(11)短路AND(&&)。

(12)短路OR(||)。

AND和OR运算符的优先级:MATLAB始终将&运算符的优先级指定为高于 | 运算符。尽管MATLAB通常按从左到右的顺序计算表达式,但表达式a|b&c按a|(b&c)形式计算。对于包含&和 | 的语句,比较好的做法是使用括号显式指定期望的语句优先级。该优先级规则同样适用于&&和 || 运算符。

可以使用括号调整默认优先级,见如下示例。

A = [3 9 5];
B = [2 1 5];
C = A./B.^2
C =
    0.7500    9.0000    0.2000

C = (A./B).^2
C =
    2.2500   81.0000    1.0000


提示

在表达式中,可以使用括号来界定计算的顺序,不必过多考虑运算符号优先级问题。


MATLAB可以说是一个具有强大功能的计算器,除了数字之间的加、减、乘、除、幂、对数等常见的运算,MATLAB的优势在于数组运算。

在命令窗口输入含有5个元素的行向量和含有5个元素的列向量,并将两个向量相加求和。

在命令行输入以下语句。

A=[1 2 3 4 5]              %行向量
B=[0.1,0.2,0.3,0.4,0.5]    %行向量
C=[9;8;7;6;5;4]            %列向量
D=[1 2 3]
E=B'                         %矩阵转置
F=A+B                        %矩阵求和
G=A+C                        %矩阵求和
H=A+D                        %矩阵求和

以下为输出。

A = 1×5数组
     1     2     3     4     5

B = 1×5数组
    0.1000    0.2000    0.3000    0.4000    0.5000

C = 6×1数组
     9
     8
     7
     6
     5
     4

D = 1×3数组
     1     2     3
E = 5×1数组
    0.1000
    0.2000
    0.3000
    0.4000
    0.5000
F = 1×5数组
    1.1000    2.2000    3.3000    4.4000    5.5000

G = 6×5数组
    10    11    12    13    14
     9    10    11    12    13
     8     9    10    11    12
     7     8     9    10    11
     6     7     8     9    10
     5     6     7     8     9

矩阵维度必须一致。

以上内容为结果输出。结果提示“矩阵维度必须一致”,是因为A具有5个元素,D具有3个元素,只有元素数目相同才能进行运算。

要以图形方式调试MATLAB程序,可使用编辑器,也可以在命令行窗口中使用调试函数。两种方法可互换。

开始调试之前,应确保程序已保存且该程序及其调用的任何文件位于搜索路径或当前文件夹中。

(1)如果在未保存更改的情况下从编辑器内运行文件,该文件在运行前会自动保存。

(2)如果从命令行窗口运行未保存更改的文件,则MATLAB软件会运行已保存的文件版本,因此看不到更改结果。

设置断点可暂停执行MATLAB文件,以便检查可能存在问题的值或变量。可以使用编辑器、命令行窗口中的函数或同时使用这两种方法设置断点。

有3种不同类型的断点:标准断点、条件断点和错误断点。要在编辑器中添加标准断点,应在要设置断点的可执行代码行的断点列处单击。断点列是编辑器左侧、行号右侧的窄列。也可以使用F12键来设置断点。

在M文件中,断点列中的可执行代码行以虚线(-)指示(见图1-10);在实时编辑器文件(.mlx)中,以深色指示(见图1-11)。

图1-10 M文件添加断点

图1-11 实时编辑器添加断点

如果可执行语句跨多行,可以在该语句中的每一行均设置断点,即使其他行在断点列中没有-(虚线)也可以,这种情况一般出现在循环中的跨行语句(即带英文省略号“…”的语句)中。例如,在图1-12所示的代码中,可以在所有行中均设置断点。

图1-12 代码换行

设置断点后,在命令行窗口或编辑器运行该文件。运行该文件会产生以下结果。

(1)“运行”按钮更改为“继续”按钮。

(2)命令行窗口中的提示符将更改为“K>>”,指示MATLAB处于调试模式且键盘受控制。

(3)MATLAB在该程序的第一个断点处暂停。在编辑器中,断点右侧的绿色箭头表示暂停。在发生暂停的行恢复运行之前,程序不会执行该行。例如,在如图1-13、图1-14的示例中,程序会在程序执行sin(i)+cos(i)+...之前暂停。

图1-13 实时编辑器在断点处暂停执行

图1-14 M文件在断点处暂停执行

(4)在M文件中,MATLAB会在函数调用堆栈(位于“调试”部分中的“编辑器”选项卡上)中显示当前工作区。如果从命令行窗口使用调试函数,可使用dbstack查看函数调用堆栈。

要暂停正在运行的程序,可转到“编辑器”选项卡并单击“暂停”按钮。MATLAB会在下一个可执行代码行处暂停执行,并且“暂停”按钮会更改为“继续”按钮。要继续执行,可单击“继续”按钮。

如果想检查长时间运行的程序的进度,以确保它按预期运行,那么“暂停”按钮是很有帮助的。


注意

单击“暂停”按钮会使MATLAB在程序文件外的文件中暂停。单击“继续”按钮会继续正常执行,不更改文件结果。


当代码暂停时,可以查看或更改变量的值,或修改代码。

1.调试时查看或更改变量

在调试时查看变量的值,以查看某行代码是否生成了预期的结果。要执行此操作,应将鼠标指针放到变量的左侧。该变量的当前值将显示在数据提示中,如图1-15所示。

图1-15 在M文件中查看断点前变量的值

数据提示会一直显示在视图中,直到移动指针。如果在显示数据提示时遇到问题,应单击包含该变量的行,然后将指针靠近该变量。

在调试时,可以更改变量的值,以查看新值是否生成预期的结果。在程序暂停状态下,在命令行窗口、工作区浏览器或变量编辑器中向变量分配新值,然后继续运行或分步执行该程序。

如图1-16、图1-17所示,MATLAB在for循环(其中i=1)内暂停。

图1-16 在M文件中查看循环中断点前变量的值

图1-17 在实时编辑器中查看循环中断点前变量的值

在命令行窗口中键入i=4,将i的当前值从1更改为4,如图1-18、图1-19所示。

图1-18 在M文件中更改循环中的参数值

图1-19 在实时编辑器中更改循环中的参数值

单击“继续”按钮运行下一行代码,MATLAB将i=4赋值给第4行代码,执行完毕后继续执行i=2,如图1-20、图1-21所示。

图1-20 在M文件中更改循环中的参数值的效果

图1-21 在实时编辑器中更改循环中的参数值的效果

将断点设在计算值后面,在命令行窗口输入的参数将不会影响断点前面的语句;如果将断点设置在第2行或第3行代码,i=4将会影响x的值。

2.调试时修改整段代码

可以在调试时修改整段代码,用来在不保存更改的情况下测试可能的修复方式。通常最好在退出调试后修改MATLAB文件,然后保存修改并运行该文件。否则,可能导致意外结果。但是,在有些情况下,也需要在调试过程中进行试验。

要在调试时修改程序,应执行以下操作。

(1)代码暂停后,修改尚未运行的部分。

断点变为灰色,表示它们无效。

(2)选择“暂停”所在行到下一个断点所在行的所有代码,右键单击,然后在上下文菜单中选择“执行所选内容”,如图1-22所示。

代码计算完成后,停止调试,保存或撤销所做的任何更改,然后继续调试过程。

图1-22 M文件在调试中执行所选内容

调试时,可以在要检查值的断点暂停,逐步执行MATLAB文件。

表1-8介绍了可用的调试操作以及可用于执行这些操作的不同方法。

表1-8 调试操作工具栏按钮和备用函数

工具栏按钮

说明

备用函数

运行到光标处

继续执行文件,直到光标所在行。也可从上下文菜单中获得

步进

执行当前文件行

dbstep

步入

执行当前文件行,如果该行调用另一个函数,则步入该函数

dbstep in

继续

继续执行文件,直到完成或遇到另一断点为止

dbcont

步出

步入后,运行被调用函数或局部函数的其余部分,然后离开被调用函数并暂停

dbstep out

暂停

暂停调试模式

退出调试

退出调试模式

dbquit

在发现问题后,通过转至“编辑器”选项卡并单击“退出调试”按钮来结束调试会话。如果要更改并保存文件,或者要在MATLAB中运行其他程序,必须结束调试会话。

退出调试后,编辑器屏幕中的暂停提示符将不再显示,命令行窗口中会重新显示正常提示符“>>”而非“K>>”,且无法再访问该调用堆栈。

如果MATLAB软件在断点位置暂停时变得无法响应,应按“Ctrl+C”组合键返回MATLAB提示符。


相关图书

MATLAB完全自学教程
MATLAB完全自学教程
精通MATLAB数字图像处理与识别(第2版)
精通MATLAB数字图像处理与识别(第2版)
MATLAB 2020中文版从入门到精通
MATLAB 2020中文版从入门到精通
MATLAB机器学习
MATLAB机器学习
MATLAB/Simulink系统仿真超级学习手册 第2版
MATLAB/Simulink系统仿真超级学习手册 第2版
MATLAB 2018从入门到精通
MATLAB 2018从入门到精通

相关文章

相关课程