找回密码
 注册
关于网站域名变更的通知
查看: 616|回复: 1
打印 上一主题 下一主题

MATLAB基础教程(6)MATLAB中的判断与流程控制

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-11-14 10:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 haidaowang 于 2019-11-14 10:35 编辑
2 B/ i  B$ }- |# ?" \2 P3 z
7 d% G- K7 G0 Q9 U# e: Y* a, ~- E, A+ O: g
判断常用于数学中的分段问题,更为复杂的问题则需要流程控制。本篇介绍matlab中的相关语法,这些语法并不难,但却很容易混淆,一方面是和其他语言,例如C语言混淆;另一方面是和matlab自身的其他语句,例如赋值混淆。
. I0 j3 m6 j0 X, U" \5 G( [# F
4 H2 \" I: d) {7 X) b1.逻辑变量

. U9 L! C+ k* `  M1.1逻辑变量的赋值

9 Q2 I! h- n6 |4 F
3 v8 z# n6 w% O# p+ L    有些语言中,逻辑变量是一种专门的变量类型,其值为true或者false,matlab中也有这个类型,但其值为1或者0。赋值方式是“变量名=表达式”,变量名的命名规则与数值变量一样,表达式是一种判断,比如数值大小的判断,或者高级函数的判断。例如输入6 P& a3 d& h+ i$ U. S# a: Y

1 U7 I5 `" t6 \: t6 ?( y1 j) Ja=1>21 P  J5 T# E; W3 c! C' ?

; F4 E9 @2 y  p* u就定义一个逻辑变量a,其值是0,表示false,在workspace里可以看见a的类型是logical。
) k/ [- h+ p) ?( B5 Q  e$ U
# h: l" v1 Q! x  C0 A

, a* y5 q$ D* u5 g+ O$ d6 ]: z3 H& T+ M* |+ _/ t

0 d1 E! W" F+ E4 J) X& |0 o2 A+ A    对初学者,可以认为数值大小的判断,是指两个1*1维的数值变量的比较。数值大小比较的方法有:>大于;<小于;>=大于等于;<=小于等于;==等于;~=不等于6种。因为数值计算有舍入误差,所以等于这个判断,有时需要用" _( u  s1 s# |6 y9 {
' A& |6 e( R. g8 a5 g4 T. I+ v7 [
abs(x1-x2)<eps
8 D: `+ C. b8 L
+ K6 v$ G( D# B1 V) x$ ?, L: [% J这样的不等式来代替,其中eps是matlab中最小的非零数值,相当于舍入误差的标准。, o" C6 \" k7 @# C* l- t

# P0 j; g% T) |" F+ j! c6 h7 Q0 I( H" O
    高级函数的判断,是指系统自带的一些函数,例如
/ P( o. R* b& w; g3 H1 |( t
# _& F6 Z/ f0 l5 D" Z/ pa=isprime(x)) \0 E  h. y2 [
  n5 m0 Z- Q9 L' Y6 {
用来判断x是否为质数,6 L3 G+ F2 w8 N

. l+ e) L) F8 Ca=exist(x)
- E' c+ q8 d" h1 D+ z9 A4 g
6 B+ d! C& R5 q( U* b用来判断是否存在变量、函数或者文件。2 p+ x6 a' l$ Y" C1 j. d% h
' {) S9 Q$ d5 B
1.2逻辑变量的逻辑运算
) ]. Y2 @+ N% `, I

5 a; c! e$ _$ A0 C逻辑变量的取值只有0或者1,他们之间可以进行逻辑运算,运算符有:&&与;||或;~非。这里需要注意:
  [+ H" Z1 h1 K1)~单独使用表示非运算,要区别于不等于~=的连用
- K: h4 D9 A& P9 i. v2)如果是高级函数的判断配合非运算,也可以实现判断,例如) Q# H9 g& s0 t* {0 k2 W

4 \7 T( C+ p7 l# m7 }& E* U- _
  • a=~isprime(x)& {! `2 R2 S+ ]; {2 q
- e) x3 _: `$ n& N6 A) ^1 e
/ U" [/ ?" L% M/ x( n: {
就相当于判断x是否为合数" O8 K2 N# A2 f8 v
- P! F: L; i7 ^  b: s+ ~6 s
1.3逻辑变量的数值运算

" W* h- m1 H9 t& i: j9 ?2 i6 ]- A% `- z! Z- D
    matlab中逻辑变量可以参与数值运算,参与时,会被数值0和1代替。例如% |' ~; C* N/ K4 \, S# `; e

8 `" q6 Y& T5 n& i! ba=1>29 j6 x& E1 L9 X3 d8 Y' T8 M, z
4 \+ |. e6 w+ A4 {& \- L% j
生成一个逻辑变量a,则
% D9 c$ F, v; P; b( n; H. Q3 X7 K$ @! E- H. X; T; r, P
b=a+1
5 t" @' Z( Z- R. `5 g0 l
0 I; J. |2 [/ [) ^+ `时,matlab会判断正在进行数值运算,然后将逻辑变量a转化成数值变量,由于a在逻辑变量时表示false,所以转化时,a相当于数值变量0,因此会得到数值变量b=0+1=1。
9 W+ Z, e$ z+ Y) U. x7 r
/ P* S. W* C. U7 ]5 K% F1 B: ?2.流程控制

& D2 ~" t8 L+ H5 w3 O/ Q2 K4 F( f. y
    matlab的流程控制和C语言类似,if和switch作为判断依据,相当于流程图的菱形框,for和while作为循环,相当于流程图的反向箭头。

1 O* J; n2 R; A& r
* C; f3 v7 @2 V9 D% m: _4 N" R0 Y1 B0 R2.1if判断

" ?+ g: R# f7 \8 `% ^
  Z. O5 e8 K6 ~+ t; M6 o' C    语法是:
& u( i, a1 u( S
9 M% ], @( T3 B$ e7 i+ O3 [    1.if 逻辑变量1
7 q  Q' |# B, z  f% e+ ]           1.执行语句14 q* v1 O' s! F' `
                  1.elseif 逻辑变量2
) l6 Z% l9 C" Y& \                         1.执行语句2
- {2 i  F% ]! G7 G                                  1.else0 q& z/ A" y3 f. b* }$ U
                                         1.执行语句3. k. y' t' ^: U2 g) }: r  E6 n$ i
                                                 1.end

0 e  T3 Z2 Y8 g1 K+ w
3 @/ B1 Y2 p& Y$ c其含义与C语言中一致,是顺序判断,即逐个if或者elseif进行判断,若逻辑变量为1,则执行语句,若为0则进行下一个判断。其中逻辑变量经常用多个逻辑变量的逻辑运算结果来代替,例如我们经常看到的是
2 A7 l$ L. l# X1 Y! P) H# v$ c$ f1 U' J6 H5 t& B5 u
  • if x>1 && y>1
    3 U; A- k4 g! K* f7 R
% _9 f$ O: B$ i$ I+ S& ^: m: }* H
# G8 C. q' x  l' n# \% d) K; ?: Y
而不是先赋值再判断的6 Q" T1 w  z, z/ c# \. W# i
, G: J$ b: R: l6 C+ O1 d/ w
  • a=(x>1) && (y>1)+ T( _9 d" M$ \  N
         1.if a) a) d% P$ N6 n
2 T  |( ?# b4 n$ Y. c! e
( N& g! e% D: m! x% i4 v
4 m" |7 k2 M8 z; P/ V$ F9 z& m  v
其实这两种方法是等效的。有时候为了书写和注释,也会先定义一个逻辑变量flag,然后再if flag。4 e* c2 Z9 K" r8 e, R) Z# ?) c$ f

8 f0 L! k1 M1 s! O' |" z" s2.2switch判断

1 h; U6 f) `: u5 g; R* Y# S: {7 m+ `1 p4 L2 {/ z/ @! D
    switch的语法是:
/ h0 m( W- S  G: |5 \& h3 O2 ^    1.switch 数值变量1* {# D% G& f3 m
              1.case 数值1. `) v4 v3 o3 K5 D3 m
                    1.    执行语句1" m1 m! Q/ m; w1 P8 Y9 o  K7 D! \6 k
                            1.case 数值2& X1 B2 u$ H: P) U
                                   1.    执行语句2
( s: F: k2 S: r4 H2 x& M$ I                                          1.otherwise
$ o( h$ }, @- L' H                                                1.    执行语句3/ B$ _) w% Y) K* p" z
                                                       1.end

' |' i' Q! t4 m& G
' R9 v' b  F% oswitch与if最大的不同是,switch只进行一次判断,即根据数值变量1的值来决定执行哪一个case,而不像if会判断多个elseif。需要强调的是,只有当数值变量1==数值1时,才会执行语句1,而之前说过,==这个判断是有舍入误差的,因此switch一般用于数值变量1只取整数时,比如sfun的判断。对初学者而言,也可以先无视switch。
. S4 z% I4 e* G  |. E6 O6 l" R
  p; I7 X' \# C) j& e, U* }2.3for循环

4 \5 Y) k) B, p6 S$ v% x7 r4 X4 F" |& k3 \0 }
    for循环的语法是:
+ B7 q7 d+ W6 Y: h- f+ M! v! ~/ ^; v# T    1.for 数值变量=向量5 [3 f# j9 e7 O; |& ?
          1.    执行语句
% \. f8 I( e4 d                 1.end

$ }' G+ C( D) ~& t" F
# ^+ \7 i3 m' v) ~; ^. K其含义是,数值变量会取向量中的每一个值,然后执行语句,在执行语句中,数值变量是一个1*1的矩阵。matlab中程序换行有两种方法,第一种方法,只能从第一行换到第二行,具体操作如下,首先在第一行中写完命令之后按下空格键,然后再按下数字键盘上的小数点键,小数点数目为3,之后按下enter键就可以实现换行。 ...+Enter;第二种方法,直接按住Shift+Enter键可以直接实现换行
2 ^! ?6 K4 Y1 f" s7 {5 h3 a( \1 e9 O6 o) k
for a=[0 1 3]8 d- d) T4 `2 Q" A/ A7 _
5 g, E* u0 B4 I% k/ k
则会让a=0,执行语句,然后a=1,执行语句,最后a=3,执行语句。这里容易和赋值语句混淆,因为a=[0 1 3]是一个数值变量赋值,赋值后a是个向量,但加上了for后,a是1*1矩阵。另外,在数值变量赋值那段,我们说过有一种常用的赋值方法是"a=初始值:步长:终值",其结果是把a赋值成一个向量,因此这也广泛用于for语句中
8 S- S+ U# V/ H* h/ ]
" L2 `. q3 S! B- r- B

' p' ~6 ]+ `( m, o0 i9 q$ P# q9 ^
/ g- Z5 t' g4 l8 Q' n
  • for a=初始值:步长:终值/ R9 e" B3 h( w) d" V
% ~" N2 i6 K; Y# @& c7 G

+ r6 Z- f4 h* g7 t* {6 Y则在执行语句中,a是一个遍历初值到终值的1*1矩阵。
, {  B2 Z1 }, o9 h% r" ^& V! J0 A6 H1 K3 V  v, Q
2.4while循环

2 e. R- Y; O2 v: v" x+ F- X- M* R4 E4 y
    while语句的语法是:5 Z/ M! O( [3 y% s, X) V: M, b
    1.while 逻辑变量! J% l0 w6 L3 [' _( |% S  w: n
           1.    执行语句8 T: w) n4 q: q( D  L; \& H+ S; D" |
                   1.end+ x: z" }0 C& l5 V

* \7 ]" e% u: M5 L6 ]" b
9 n: ~' T* u; @
+ z% U2 r. P4 [+ B- Y7 u2 y0 z
其含义是,当逻辑变量为1时,执行语句,直到逻辑变量为0,因此while的执行语句中,一定有改变逻辑变量的部分,否则就是死循环。比如写了while a<10,就一定会在执行语句中有类似a=a+1这样的赋值语句,使得若干次循环后,逻辑变量为0。总体而言,while并不如for稳定,所以初学者也可以无视while。

& q* ]  m3 K  z* ^! S8 D% o/ F% k% f8 t/ u( ~( Z2 ?3 V

  ]- C. _* ]6 B/ Q+ S$ L8 ]
! J& s% l( ?0 @7 h: P
( C5 w) g) j- x3 t3 {& B0 E4 r- `
7 {/ a, }) x& x8 ^) h
( p. L5 x+ ^1 S+ R3 v
# i4 T& K. n6 E6 Y- R
4 t, t$ u) [1 ^/ h
/ F; T' Z. A5 j8 H* ?' d
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-29 22:15 , Processed in 0.156250 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表