EDA365电子论坛网

标题: MATLAB基础教程(6)MATLAB中的判断与流程控制 [打印本页]

作者: haidaowang    时间: 2019-11-14 10:33
标题: MATLAB基础教程(6)MATLAB中的判断与流程控制
本帖最后由 haidaowang 于 2019-11-14 10:35 编辑 ) @! L0 Y$ ]( j. c3 Z6 E+ g

4 g3 W3 ]/ c8 A  ]  L
- ^/ }. k) l3 P* x判断常用于数学中的分段问题,更为复杂的问题则需要流程控制。本篇介绍matlab中的相关语法,这些语法并不难,但却很容易混淆,一方面是和其他语言,例如C语言混淆;另一方面是和matlab自身的其他语句,例如赋值混淆。
2 c8 C' z8 M5 s3 g  x' Y' R3 n) d! Y* b2 c, ?
1.逻辑变量

2 q8 L7 m1 o6 y1 K  F1.1逻辑变量的赋值
: d+ {; ?; s% Y; ^3 [3 ~( W9 r6 d

* a. P' B6 N& n8 q# I2 Z5 x- T5 E% P    有些语言中,逻辑变量是一种专门的变量类型,其值为true或者false,matlab中也有这个类型,但其值为1或者0。赋值方式是“变量名=表达式”,变量名的命名规则与数值变量一样,表达式是一种判断,比如数值大小的判断,或者高级函数的判断。例如输入
' r; |0 C: h- j. [
) P4 X. V6 t0 ^4 {2 R0 na=1>27 c; D( O- P  p

+ e4 g+ o2 h, M- x  F就定义一个逻辑变量a,其值是0,表示false,在workspace里可以看见a的类型是logical。1 k( R# ^8 i8 ?
+ t0 g9 O2 \+ l0 U  S# e4 l  |
! D  x0 j! I" z3 K
" J, a: S! O3 T8 }% y( G

% b1 `7 Q2 w2 K. B3 z    对初学者,可以认为数值大小的判断,是指两个1*1维的数值变量的比较。数值大小比较的方法有:>大于;<小于;>=大于等于;<=小于等于;==等于;~=不等于6种。因为数值计算有舍入误差,所以等于这个判断,有时需要用4 p* y$ g: |2 x
4 N9 K# K  o" z/ T2 l, R$ {
abs(x1-x2)<eps
4 I& A' }. H/ T' K  Y/ }1 q% @' s" M4 I( _; e8 A. ~+ e
这样的不等式来代替,其中eps是matlab中最小的非零数值,相当于舍入误差的标准。4 \+ q+ U! I5 ]1 r2 S

7 `( H- `8 u# D. Q  v' `' e( k3 x* X+ z
    高级函数的判断,是指系统自带的一些函数,例如
  k7 f5 @1 Y: t- Y. N$ I% m3 t% S' W0 V/ M7 n
a=isprime(x)
6 V$ z4 [4 Z! w9 ?6 f/ S, \" }6 F1 t9 q1 ?' H4 v! i+ G
用来判断x是否为质数,
0 J. _$ X/ u! ~2 G5 \, t8 [# M7 t3 j" P) i4 ]( y" p5 O
a=exist(x)
) ]( n3 C# p  _" g$ U5 e* n
6 o, l' w2 d# c! M* S, Z! a- n用来判断是否存在变量、函数或者文件。+ @% z4 P6 \9 I; [5 @9 a
& s7 l  O  X- U1 h
1.2逻辑变量的逻辑运算

! Q( n& P/ J. p! A& P, P, y- L; C, ]& |" a- m/ g6 V
逻辑变量的取值只有0或者1,他们之间可以进行逻辑运算,运算符有:&&与;||或;~非。这里需要注意:0 \1 |6 E0 q9 m! ?4 n- k
1)~单独使用表示非运算,要区别于不等于~=的连用
- B$ q6 Y4 A+ j) V% A) Q  t2)如果是高级函数的判断配合非运算,也可以实现判断,例如0 z; n0 ~; Z; h/ [

2 i# s. r" H3 {

8 ?: m) L/ c' [$ P; F2 B
: o* E1 v3 A' [: V就相当于判断x是否为合数
: X& R5 a' B- [* e, f
7 H$ t) d7 o; F/ ~" ~: K) h1.3逻辑变量的数值运算

% m9 ~7 `4 {& Q. |
$ N- O- e* Z- ~8 V    matlab中逻辑变量可以参与数值运算,参与时,会被数值0和1代替。例如1 w, _+ O; g; C. O5 [3 G- f

5 i1 c. g+ \  I& oa=1>2
8 l/ g7 P) e: T/ P1 W
8 V2 v; k5 ~1 M0 u2 ?8 r生成一个逻辑变量a,则
& P- h2 f& _$ N# _# E- }+ v; f3 r& u# B1 L& n  ?: x
b=a+1
. z1 ]) P! z+ ?/ {
" _; d2 b8 Y, r0 a" ~8 W) k时,matlab会判断正在进行数值运算,然后将逻辑变量a转化成数值变量,由于a在逻辑变量时表示false,所以转化时,a相当于数值变量0,因此会得到数值变量b=0+1=1。" t3 @) _  y8 ^7 N5 B2 o
6 M: P+ t" {$ G9 B0 {/ e+ K7 s
2.流程控制

! O- D( \" S  b* p8 ~
; \! z# e. |  _# s' ^' C6 s* @    matlab的流程控制和C语言类似,if和switch作为判断依据,相当于流程图的菱形框,for和while作为循环,相当于流程图的反向箭头。
+ U1 [! }5 L' Y) t  z

2 P3 f- O" m6 S! `9 H1 B% x) ^2.1if判断
$ t% A6 D2 k& _) B# m

* E6 W1 k. ]( c/ W/ u) B    语法是:  H' _$ N1 s5 A0 C' H1 ]

3 J- I5 {* J4 C; ?$ y" W8 h    1.if 逻辑变量1
4 a& [& j& [' F5 p, @8 O* G# E           1.执行语句1
6 G/ r/ C$ V8 v: d& q9 a                  1.elseif 逻辑变量25 Y5 y0 g- L* [( o2 R
                         1.执行语句2
/ g% B& p0 D9 i& W0 Y$ r; j& `                                  1.else: d% x0 m+ I) O! q
                                         1.执行语句3
& i- W& z2 Y! y; a                                                 1.end
" u# U0 K6 }8 C. h9 E: p) u: u

2 W; O1 O8 i% K2 a$ N8 P" c9 c其含义与C语言中一致,是顺序判断,即逐个if或者elseif进行判断,若逻辑变量为1,则执行语句,若为0则进行下一个判断。其中逻辑变量经常用多个逻辑变量的逻辑运算结果来代替,例如我们经常看到的是" p, J- C4 h6 q, ^; p9 x

9 C) x, n: [/ S/ H# o

0 Z  T7 z0 M# S" m9 U6 s: l9 t1 w
而不是先赋值再判断的$ r6 K7 ~3 P5 `7 A

0 w0 d$ o! e5 H         1.if a1 ?0 p3 |( M) p0 Q! w

$ {7 ]. B' y9 I& B4 h4 S

- }& ]# C" k7 K
" F* j: X+ \" J) J其实这两种方法是等效的。有时候为了书写和注释,也会先定义一个逻辑变量flag,然后再if flag。
+ t& H( g2 R8 q" C4 a
1 n4 e* Y/ E) k- d; s4 c5 C' `2.2switch判断
; b0 E) r% R! @4 T
8 k5 |1 V) a9 \* S3 j6 y8 [" H4 I
    switch的语法是:) O$ U2 ~7 {/ b
    1.switch 数值变量1
6 w" D' n8 g& A. p6 l: l  Q" e              1.case 数值1
1 ]+ R3 i2 Q0 X6 m7 o7 ^8 w% _                    1.    执行语句1- o+ {! }% M/ M
                            1.case 数值2
* I, I; w3 p" x8 D# P                                   1.    执行语句2
% v$ H, T4 g4 \                                          1.otherwise, R% K; b4 w8 C( n+ N% B
                                                1.    执行语句3
' B& f) e; r1 [2 M                                                       1.end

* F" H" S+ }$ ^' Q/ t
2 i1 g3 T1 ?1 ^9 b! nswitch与if最大的不同是,switch只进行一次判断,即根据数值变量1的值来决定执行哪一个case,而不像if会判断多个elseif。需要强调的是,只有当数值变量1==数值1时,才会执行语句1,而之前说过,==这个判断是有舍入误差的,因此switch一般用于数值变量1只取整数时,比如sfun的判断。对初学者而言,也可以先无视switch。* K$ x& m" U- |- l# H
/ l& S* Y- ?5 K) p' Q5 i
2.3for循环
! f' O6 U# D1 l+ ^/ e; `! }
- p+ n/ v5 M6 u
    for循环的语法是:
, H4 b% H3 ^9 c9 v2 g    1.for 数值变量=向量
4 G( `( c, k) q          1.    执行语句* J* S8 b8 e! `' A8 w+ w! q# J
                 1.end
, t% D. o# U( h' o% @% ^* F

6 ~. M# e' ?$ H0 ~9 e其含义是,数值变量会取向量中的每一个值,然后执行语句,在执行语句中,数值变量是一个1*1的矩阵。matlab中程序换行有两种方法,第一种方法,只能从第一行换到第二行,具体操作如下,首先在第一行中写完命令之后按下空格键,然后再按下数字键盘上的小数点键,小数点数目为3,之后按下enter键就可以实现换行。 ...+Enter;第二种方法,直接按住Shift+Enter键可以直接实现换行
3 U7 l4 _3 j' p, R5 T* v7 ^- `; J; h, N0 j
for a=[0 1 3]
! [8 L0 s0 e2 K6 y" L* W; S+ A" _# F3 u' y
则会让a=0,执行语句,然后a=1,执行语句,最后a=3,执行语句。这里容易和赋值语句混淆,因为a=[0 1 3]是一个数值变量赋值,赋值后a是个向量,但加上了for后,a是1*1矩阵。另外,在数值变量赋值那段,我们说过有一种常用的赋值方法是"a=初始值:步长:终值",其结果是把a赋值成一个向量,因此这也广泛用于for语句中
9 W# ]& N. k  ~% Z- y4 F2 j  J# j/ q/ z  t+ t0 P) n, L" i3 Q! h. ~+ `
8 B% v2 T3 i& g8 X) ^8 Y8 x
0 n" y; g: |$ V9 f+ R

& Q( A/ O5 K7 N4 Y( B
9 y' A1 n( ?- q; e0 O, l% |2 H. o则在执行语句中,a是一个遍历初值到终值的1*1矩阵。" L* R- M$ j- G6 W. U3 _$ ?2 Z

9 r7 r3 X  S) r9 c9 e2 L2.4while循环
  F' y9 r- y% E4 G$ A' K6 H

! ?6 z) {8 z3 N; t, C$ o. J    while语句的语法是:+ d% a8 g" K9 X9 K
    1.while 逻辑变量
! M) j, _# J+ u: U           1.    执行语句; L4 M1 x( a4 g+ ~- V& u* T4 ~$ X1 h* M
                   1.end. y/ ]  |! l4 P0 n) U  `6 A( g
' T( W& F( ]" [
) H7 F/ E6 C* A" n& j
! I( @6 R5 V& p) [
其含义是,当逻辑变量为1时,执行语句,直到逻辑变量为0,因此while的执行语句中,一定有改变逻辑变量的部分,否则就是死循环。比如写了while a<10,就一定会在执行语句中有类似a=a+1这样的赋值语句,使得若干次循环后,逻辑变量为0。总体而言,while并不如for稳定,所以初学者也可以无视while。
8 ~, B& `# g8 q6 p5 b
% b7 `/ q6 C' W0 M- E
% A% z  U/ g( I/ [1 U3 l) y- X( e
# {: x: q. w: Z; Y) f) E
; r) N, \, U' p+ v  r( @; x4 {8 i6 D
# d0 a$ [' _3 s
. R9 X) Q2 Z+ |

5 u* ~) T- H3 p5 |8 m% ?" \0 @# \
7 m6 j' m! S) N

: d, M7 }' E- b) w2 j  q
作者: relchhiclty    时间: 2019-11-14 18:41
谢谢分享




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2