当前位置: 首页 > article >正文

MATLAB系列03:分支语句和编程设计

MATLAB系列03:分支语句和编程设计

  • 3. 分支语句和编程设计
    • 3.1 自上而下的编程方法简介
    • 3.2 伪代码的应用
    • 3.3 关系运算符和逻辑运算符
      • 3.3.1 关系运算符
      • 3.3.2 小心==和~=运算符
      • 3.3.3 逻辑运算符
      • 3.3.4 逻辑函数
    • 3.4 选择结构
      • 3.4.1 if结构
      • 3.4.2 switch结构
      • 3.4.3 try/catch结构的应用
    • 3.5 附加的画图特性
      • 3.5.1 控制x,y轴绘图的上下限
      • 3.5.2 在同一坐标系内画出多个图像
      • 3.5.3 创建多个图像
      • 3.5.4 子图像
      • 3.5.5 对画线的增强控制
      • 3.5.6 文本字符串的高级控制
      • 3.5.7 极坐标图像
      • 3.5.8 注释并保存图像
    • 3.6 总结

3. 分支语句和编程设计

MATLAB语句有两大类控制顺序结构:

  1. 选择结构,用于选择执行特定的语句
  2. 循环结构,用于重复执行特定的代码

3.1 自上而下的编程方法简介

所谓的自顶向下的编程方法,本质上就是编写程序的视角从整体的宏观性逐层进入具体的微观性的一种编程思想。我们编写程序时一开始不用思考得事无巨细,把所有细节都想清楚;也不要面条式的想到哪里写到哪里。而应该是自顶向下的,从一个大的粗的核心的任务开始,逐级细分,最后再完成最底层的具体实现。

程序设计的基本步骤:

  1. 清晰地陈述出你要解决的问题。
  2. 确定程序所需地输入量和程序所产生的输出量。
  3. 为你的程序设计算法
  4. 将算法转化为 MATLAB 语句
  5. 调试MATLAB语句

3.2 伪代码的应用

伪代码是 MATLAB 和英语的混合体。和MATLAB 一样,它是结构化的,一行表达一个明确的意思或代码的片段,但每一行的描述用的是英语或其他人类语言。伪代码的每一行都应用普通简单且易于理解的英语或中文描述。因为修改简单灵活,所以伪代码在开发算法的过程中非常的有用。

3.3 关系运算符和逻辑运算符

MATLAB 把 0 值作为结果 false,把所有的非 0 值作为结果 ture。

3.3.1 关系运算符

关系运算符是指两数值或字符操作数的运算符,这种运算将会根椐两操作数的关系产生结果 true 或 false。关系运算的基本形式如下
a 1   o p   a 2 a_1\,op\,a_2 a1opa2
image-20240913224851822

关系运算符也可用于标量和数组的比较,示例

>> a=[1 0;-2 1];
>> b=0;
>> a>b

ans =

  2×2 logical 数组

   1   0
   0   1

注意因为字符串实际上是字符的数组,关系运算符也比较两个相同长度的字符串。如果它们有不同的长度,比较运算将会产生一个错误。

编程隐患:

不要混淆关系运算符(==)和赋值运算符(=)

3.3.2 小心==和~=运算符

等于运算符(==)如果两变量值相同将会返回变量值 1,如果不同将返回 0。不等运算符(~=)如果两变量值不同则返回 1,相则返回 0。用这两个运算符比较两个字符串他是安全的,不会出现错误。但对两个数字数据的比较,将可能产生异想不到的错误。两个理论上相等的数不能有一丝一毫的差别,而在计算机计算的过程中存在修正误差,从而可能在判断相等与不相等的过程中产生错误, 这种错误叫做round off 错误。例如

>> a=0;
>> b=sin(pi);
>> a==b

ans =

  logical

   0

因此在检测两数值是否相等时,要考虑是否由于修正误差可能会使两个本来应该相等的值不相等了。这时可以在修正误差的范围内,判断它们是否近似相等。

3.3.3 逻辑运算符

image-20240913230307455

标量和数组,数组和数组之间都可以进行逻辑运算,示例:

>> a=[1 0;0 1];
>> b=0;
>> a & b

ans =

  2×2 logical 数组

   0   0
   0   0

>> b=[1 1 ;0 0];
>> a|b

ans =

  2×2 logical 数组

   1   1
   0   1

如果两个数组大小不相同,会产生运行时错误。

在运算顺序中,逻辑运算在所有的数学运算和关系运算之后进行

3.3.4 逻辑函数

image-20240913230713177

3.4 选择结构

MATLAB的选择结构有:if结构,switch结构和try/catch结构

3.4.1 if结构

基本形式如下

if control_expr_1
    Statement 1
    Statement 2
elseif control_expr_2
    Statement 1
    Statement 2
else
    Statement 1
    Statement 2
end

在一个 if 结构中, 可以有任意个 elseif 语句, 但 else 语句最多有一个。 只要上面每一个控制表达式均为 0, 那么下一个控制表达式将会被检测。 一旦其中的一个表达式的值非 0,对应的语句块就要被执行, 然后跳到 end 后面的第一个可执行语句继续执行。 如果所有的控制表达式均为 0, 那么程序将会执行 else 语句。 如果没有 else 语句, 程序将会执行 end 后面的语句, 而不执行 if 结构中的部分。

示例:

a=2;
b=1;
c=-2;
if (b^2 - 4*a*c) < 0
    disp('This equation has two complex roots.');
elseif (b^2 - 4*a*c) == 0
    disp('This equation has two identical real roots.');
else
    disp('This equation has two distinct real roots.');
end
This equation has two distinct real roots.

3.4.2 switch结构

switch 结构是另一种形式的选择结构。 程序员可以根据一个单精度整形数, 字符或逻辑表达式的值来选择执行特定的代码语句块。 基本形式如下:

switch (switch_expr)
case case_expr_1
    Statement 1
    Statement 2
case case_expr_2
    Statement 1
    Statement 2
otherwise
    Statement 1
    Statement 2
end

如果 switch_expr 的值与 case_expr_1 相符, 那么第一个代码块将会被执行, 然后程序将会跳到 switch 结构后的第一个语句。 如果 switch_expr 的值与 case_expr_2 相符, 那么第二个代码块将会被执行, 然后程序将会跳到 switch 结构后的第一个语句。 在这个结构中, 用相同的方法来对待其他的情况。 otherwise 语句块是可选的。 如果它存在的话, 当 switch_expr的值与其他所有的选项都不相符时, 这个语句块将会被执行。 如果它不存在, 且 witch_expr的值与其他所有的选项都不相符, 那么这个结构中的任何一个语句块都不会被执行。

示例:

value=1;
switch (value)
case {1, 3, 5, 7, 9}
    disp('The value is odd.');
case {2, 4, 6, 8, 10}
    disp('The value is even.');
otherwise
    disp('The value is out of range.');
end

3.4.3 try/catch结构的应用

try/catch 结构是选择结构的一种特殊形式, 用于捕捉错误。 一般地, 当一个 MATLAB 程序在运行时遇到了一个错误, 这个程序就会中止执行。 try/catch 结构修改了这个默认行为。如果一个错误发生在这个结构的 try 语句块中, 那么程序将会执行 catch 语句块, 程序将不会中断。 它将帮助程序员控制程序中的错误, 而不用使程序中断。结构的基本形式如下:

try
    Statement 1
    Statement 2
catch
    Statement 1
    Statement 2
end

示例:

% Initialize array
a = [ 1 -3 2 5];
try
% Try to display an element
    index = input('Enter subscript of element to display: ');
    disp(['a(' int2str(index) ') = ' num2str(a(index))] );
catch
    % If we get here an error occurred
    disp( ['Illegal subscript: ' int2str(index)] );
end
Enter subscript of element to display: 8
Illegal subscript: 8

3.5 附加的画图特性

3.5.1 控制x,y轴绘图的上下限

axis命令或函数允许程序员设定和修改坐标的上下限。

image-20240914084028957

示例:

x=-2*pi:pi/20:2*pi;
y=sin(x);
plot(x,y);
title('Plot of sin(x) vs x');
image-20240914084318106

修改上下限:

axis([0 pi 0 1])
image-20240914084443074

3.5.2 在同一坐标系内画出多个图像

在一般情况下,创建一个新的图象就要用到一个 plot 命令,前面的数据就会自动消失。这种行为可以通过使用 hold 命令得到修改。当 hold on 命令执行后,所有的新的图象都会叠加在原来存在的图象。hold off 命令可恢复默认情况,用新的图象来替代原来的图象。

x = -pi:pi/20:pi;
y1 = sin(x);
y2 = cos(x);
plot(x,y1,'b-');
hold on;
plot(x,y2,'k--');
hold off;
legend ('sin x','cos x');
image-20240914084628209

3.5.3 创建多个图像

MATLAB 可以创建多个图象窗口, 每个窗口都有不同的数据。 我们用图象数来区分这些图象窗口, 图象数是一个小的正整数。 第一个图象窗口称为图 1, 第二个图象窗口为图 2,依次类推。 这些窗口中的一个称为当前图象窗口, 所有的新的画图命令将会展示在那个窗口中。gcf 函数用于当于返回当前图象数。 当你需要知道当前图象数时, 你就把这个函数写入M 文件中。

figure(1);
x = 0:0.05:2;
y1 = exp(x);
plot(x,y1);
figure(2);
y2 = exp(-x);
plot(x,y2);
Image 1 Image 2

3.5.4 子图像

创建子图像的命令

subplot(m,n,p)

该命令在当前窗口创建 m × n m\times n m×n个子图像,按m行,n列排列,并选择子图像p来接收当前命令。子图像从左到右,从上到下排列。

figure(1);
subplot(2,1,1);
x = -pi:pi/20:pi;
y = sin(x);
plot(x,y);
title('Subplot 1 title');
subplot(2,1,2);
x = -pi:pi/20:pi;
y = cos(x);
plot(x,y);
title('Subplot 2 title');
image-20240914085446174

3.5.5 对画线的增强控制

除了控制画线的颜色、样式和符号形式,我们还可以设置其中四种附加属性。

image-20240914085634335
x=0:pi/15:4*pi;
y=exp(2*sin(x));
plot(x,y,'-ko','LineWidth',3.0,'Markersize',6 ,...
'MarkerEdgeColor','r','MarkerFaceColor','g');
image-20240914085745232

3.5.6 文本字符串的高级控制

文本的字体通可以通过流修饰符(stream modifiers)修改。 一个流修饰符是一个特殊的字符序列, 用来告诉编译器改变它的行为。 最普通的流修饰符是:

image-20240914085932282

特殊的希腊字母或数学符号也可用在文本字符串中。 通过嵌入特殊的转义序列来创建这些字符。 这些转义序列是支持 TEX 语言的特殊序列的一个子集。 如果要打印转义符\, {, }, _, 或^就必须在前面加上一个反斜杠。

image-20240914090102620

3.5.7 极坐标图像

MATLAB 中包括一个重要的函数叫做 polar, 它用于在极坐标系中画图。 这个函数的基本形式如下:

polarplot(theta,r)

其是 theta 代表一个弧度角数组, r 代表一个距离数组。 它用来画以角度为自变量的函数的极坐标图是非常有用的。

image-20240914090517134

3.5.8 注释并保存图像

一旦 MATLAB 成功创建一个图象, 那么用户就可以运用画图工具条上的 GUI 工具来编辑和注释这些图象。

3.6 总结

image-20240916110237045

http://www.kler.cn/a/311878.html

相关文章:

  • Java Stream 流常用操作大全
  • 河南省的一级科技查新机构有哪些?
  • 微信小程序_模板与配置_day2
  • [HNCTF 2022 Week1]ret2shellcode-好久不见12
  • srs http-flv处理过程
  • 统信UOS开发环境支持Electron
  • 指挥中心操作台怎么布局更合理
  • Can‘t connect to local MySQL server through socket
  • 【线性规划求解系列】MATLAB中使用linprog解决线性规划问题
  • 【学术会议:中国杭州,机器学习和计算机应用面临的新的挑战问题和研究方向】第五届机器学习与计算机应用国际学术会议(ICMLCA 2024)
  • 大数据-141 - ClickHouse 集群 副本和分片 Zk 的配置 Replicated MergeTree原理详解
  • Linux 环境永久更换国内pip镜像源地址
  • 【MySQL】表的相关操作
  • 你敢相信吗,我用AI撸了一个在线计算器网站!
  • ElasticSearch7整合es-head,ES配置密码
  • 微软 Azure AI 服务免费试用及申请:语音识别、文本转语音、基于视觉、语言处理、文档分析等10大场景
  • ReentrantLock实现原理
  • opencv anaconda yolov5安装流程
  • 【C++】C++ STL探索:Priority Queue与仿函数的深入解析
  • Leetocde146. LRU 缓存
  • 梧桐数据库(WuTongDB):postgresql 12的CBO(Cost-Based Optimizer)优化器
  • 浅谈人工智能之基于HTTP方式调用本地QWen OPenAI接口(Java版)
  • 股指期权交易详细基础介绍
  • 图像亮度均衡算法
  • QFramework v1.0 使用指南 更新篇:20240918. 新增 BindableList
  • 利用反射实现动态代理