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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 haidaowang 于 2019-11-14 10:35 编辑 ) B, ^* f9 k8 h; p2 z3 e

6 Y% B0 ]+ ~9 s- B5 I
6 {. |/ H. l" l! ?2 f2 g5 C判断常用于数学中的分段问题,更为复杂的问题则需要流程控制。本篇介绍matlab中的相关语法,这些语法并不难,但却很容易混淆,一方面是和其他语言,例如C语言混淆;另一方面是和matlab自身的其他语句,例如赋值混淆。, m; l: M- O8 b7 W) _4 X; b& s- g
* z9 T* Y+ ~5 K; b8 R7 }
1.逻辑变量
8 ~/ z; r' c1 G, P' }0 p
1.1逻辑变量的赋值

; s% I8 B/ C/ e0 d, Q( `0 ?
$ l! M! F3 e: s* Y" j    有些语言中,逻辑变量是一种专门的变量类型,其值为true或者false,matlab中也有这个类型,但其值为1或者0。赋值方式是“变量名=表达式”,变量名的命名规则与数值变量一样,表达式是一种判断,比如数值大小的判断,或者高级函数的判断。例如输入0 f2 g& w8 W5 t) q7 Z

3 [$ l) Z# P6 ^6 `, U0 fa=1>2
, a$ p, g+ c6 K( P/ X: M+ X: e
& v( J( K4 U. B8 _$ ^就定义一个逻辑变量a,其值是0,表示false,在workspace里可以看见a的类型是logical。
5 `- c) W. f7 a% f! u% |- P/ d. F" j) q  Q
! d, A( t9 J" x
0 @+ ]% I; K9 Z

# _0 H6 W' U6 X0 ?' H/ g    对初学者,可以认为数值大小的判断,是指两个1*1维的数值变量的比较。数值大小比较的方法有:>大于;<小于;>=大于等于;<=小于等于;==等于;~=不等于6种。因为数值计算有舍入误差,所以等于这个判断,有时需要用2 X; i7 z2 i" f- {# {0 I( t! c; o
( N, ?0 z1 c5 h# ]' |
abs(x1-x2)<eps
: m+ ~2 H2 p5 R/ ?  T/ S
- Z3 p; {+ @2 O8 N7 l这样的不等式来代替,其中eps是matlab中最小的非零数值,相当于舍入误差的标准。9 l7 }' D. J0 N8 B& D' h3 F
' Q8 h  _) f  Y7 P
0 N% P) ~2 s; B) C1 E- V
    高级函数的判断,是指系统自带的一些函数,例如( X8 E* H9 ^; h3 |" M

7 f. T  H6 B$ l# Ma=isprime(x)
9 Z: A3 P4 c+ R* m" N; q
) Q: @, V6 V& U8 o8 W5 ~用来判断x是否为质数,
9 h" K# w5 h8 I, E0 N' [. i
1 E& V' j1 K& r4 oa=exist(x)* v! B  @, c: F  `/ J/ g

" q% [" q! D1 A" F* ]+ t* X) D用来判断是否存在变量、函数或者文件。1 N) L, s' i& o" d) B$ _! d/ w0 p9 M

* @2 J. I% k6 J# K& y1.2逻辑变量的逻辑运算
' ~$ s: \% F5 \+ Z* f

: {" D8 m; J' h2 i0 }7 f逻辑变量的取值只有0或者1,他们之间可以进行逻辑运算,运算符有:&&与;||或;~非。这里需要注意:
9 f' d4 @3 C; j9 ^6 r' m' V) f8 p% h1)~单独使用表示非运算,要区别于不等于~=的连用
) J6 \$ _1 n) P5 \9 q; |+ Q5 X2)如果是高级函数的判断配合非运算,也可以实现判断,例如
0 `7 h6 Q2 ]/ p
# Y' p; }$ |2 _7 h+ F( L9 l
  • a=~isprime(x)
    ) N" H. z! z" C+ Q

4 V7 w* Q4 n6 O: c6 L7 P6 |5 H8 P; R( p
就相当于判断x是否为合数9 y# f' _/ b+ e5 L" N

1 t1 }* Y7 }; E# ~, {$ X1.3逻辑变量的数值运算
, I2 [2 P" V- Y7 q$ R
# B# |% o& p. X9 P
    matlab中逻辑变量可以参与数值运算,参与时,会被数值0和1代替。例如
- W7 l8 `0 B' r8 d! o
8 ]( [, J) N! [1 D2 a8 Q/ Za=1>2
7 t0 b: A' W( k# P7 v5 ^: S0 e; ^
0 `: r; k0 S! J- u生成一个逻辑变量a,则) j6 u0 G4 O$ s! @9 w
: X4 W6 _% G) Z# S' |8 U9 `2 ?
b=a+1! t7 B8 p' s5 L9 u9 K; h. D
1 W- s6 t2 @* \, y- _) f
时,matlab会判断正在进行数值运算,然后将逻辑变量a转化成数值变量,由于a在逻辑变量时表示false,所以转化时,a相当于数值变量0,因此会得到数值变量b=0+1=1。
3 _- l0 `7 y" l  w+ C3 S) s; w+ j+ U
! i) r# d( e, A7 B0 |2.流程控制
0 J1 M" x. v3 i. y& e) ]: w. j* `! n
  A( f4 D% z, O: e. B" E
    matlab的流程控制和C语言类似,if和switch作为判断依据,相当于流程图的菱形框,for和while作为循环,相当于流程图的反向箭头。

, r" j1 X/ W& o, C  y5 c
: K) `$ |4 [) Z2.1if判断

: y9 }! I; {6 B5 a! R% O' n. x5 t4 k! ], @; b
    语法是:
" P, A' b( y* j/ M$ H
; x& g9 i/ s1 j7 S! s- N& S8 Z9 P    1.if 逻辑变量1" X. ~1 C) X6 G/ t- G
           1.执行语句1# ^+ Y7 a6 r' O! l& O
                  1.elseif 逻辑变量2
/ b" T  F" L0 r9 ~; z# g- F" y* E                         1.执行语句2
( l$ d* R( o, Z: ]3 F                                  1.else, l5 e- H0 n. B( h
                                         1.执行语句3" }  ]9 o# V8 Y  v0 ~- U5 ?7 p
                                                 1.end
* i( z+ v  V, P2 ]$ k* u1 Q1 e
$ e7 j& a2 s' r" A! H2 F5 K
其含义与C语言中一致,是顺序判断,即逐个if或者elseif进行判断,若逻辑变量为1,则执行语句,若为0则进行下一个判断。其中逻辑变量经常用多个逻辑变量的逻辑运算结果来代替,例如我们经常看到的是
6 @3 i! N* T6 J4 Z# d3 n& [& p" P, m
  • if x>1 && y>1
    * j2 W. ?% G  R/ p1 H; Y
5 J% [' W7 `$ {2 [3 [8 `2 N& \
, j$ Y4 q! t0 w8 C( I
而不是先赋值再判断的
0 y% w+ A. L; i( x) V# V" C1 R2 a4 y" U* V9 g3 V' B- _6 H# U
  • a=(x>1) && (y>1)0 h3 ?" ?' c, P% n
         1.if a
. m% G: D' T! a! ~) U: F5 i+ K# a, l
" s8 @0 F5 N* R5 z/ e5 q- ~0 f4 ~

: N- O) C# t8 S' y; T% E5 o4 `其实这两种方法是等效的。有时候为了书写和注释,也会先定义一个逻辑变量flag,然后再if flag。
$ w$ C/ |5 _8 P! K9 i3 b  U$ T  }  A! o8 L
2.2switch判断
9 w: ^# d9 ]* T% V* }% |8 J

  k, O0 S; ~0 a  J& i4 M0 O; u7 K' _    switch的语法是:) \+ w; W0 J) [  T7 |" K
    1.switch 数值变量1
0 {+ P# x& ]& J+ \" L" O              1.case 数值1
3 L% V- f1 P, q- {9 @" @                    1.    执行语句1
; }. k' c) e5 [                            1.case 数值2
- M0 F; R6 H1 v  T* T9 F% V. M                                   1.    执行语句27 ~1 p1 P) G/ L2 @  W
                                          1.otherwise
( {( G2 `/ d7 v3 K                                                1.    执行语句3
4 T' Y5 z7 T. ~                                                       1.end
6 w- {0 J) x- l7 ?$ f  A, I
3 W6 {. O9 p# H" T  h
switch与if最大的不同是,switch只进行一次判断,即根据数值变量1的值来决定执行哪一个case,而不像if会判断多个elseif。需要强调的是,只有当数值变量1==数值1时,才会执行语句1,而之前说过,==这个判断是有舍入误差的,因此switch一般用于数值变量1只取整数时,比如sfun的判断。对初学者而言,也可以先无视switch。
0 q' @: |, }3 S$ O5 h, z8 L: H/ ?% J+ o: s
2.3for循环
% `! w  s. c% g, v9 v

6 J" P" a& e8 }+ V2 t! \    for循环的语法是:
; M, |7 y2 |! G5 S/ Z5 N" C    1.for 数值变量=向量$ _% W/ _" X3 G: n! S9 P9 T9 Q. y' z
          1.    执行语句0 ?; O* h/ N/ P
                 1.end
  ~3 Y4 |& ~- a6 S, h+ Q" y
& b) m0 ]; z# T$ Q, p$ v3 r
其含义是,数值变量会取向量中的每一个值,然后执行语句,在执行语句中,数值变量是一个1*1的矩阵。matlab中程序换行有两种方法,第一种方法,只能从第一行换到第二行,具体操作如下,首先在第一行中写完命令之后按下空格键,然后再按下数字键盘上的小数点键,小数点数目为3,之后按下enter键就可以实现换行。 ...+Enter;第二种方法,直接按住Shift+Enter键可以直接实现换行  D4 J$ o. \4 Q* u( b, ?; U
6 o; h3 g# v( q' i
for a=[0 1 3]5 I: Q% J, d# A  R4 T/ V! p

6 A  h: j( l  ?4 o" ^则会让a=0,执行语句,然后a=1,执行语句,最后a=3,执行语句。这里容易和赋值语句混淆,因为a=[0 1 3]是一个数值变量赋值,赋值后a是个向量,但加上了for后,a是1*1矩阵。另外,在数值变量赋值那段,我们说过有一种常用的赋值方法是"a=初始值:步长:终值",其结果是把a赋值成一个向量,因此这也广泛用于for语句中. W: a! t& J- C; _  f; F3 t( L* f. B
( a, ^2 g( u& U# ?
4 ~2 v2 @- _! t% c" M

  p/ C* W- s' a* ]2 H% h
  • for a=初始值:步长:终值. e* A% w1 H4 v+ D- r7 D/ `

- L* I1 }4 C7 |# @9 O( o" s1 Y9 ]3 B. X$ m3 T) N
则在执行语句中,a是一个遍历初值到终值的1*1矩阵。
& j/ u" g7 Z. k* x( {$ A1 ^
" P9 V5 u8 L& y1 f% h! `2.4while循环
, }! p) _/ l2 z/ z0 q+ a
, U& v& ^( Y  i( E$ H$ y
    while语句的语法是:+ y5 F/ A) _& J( y' S9 }
    1.while 逻辑变量
4 q4 b. o9 e# h; b( y6 B           1.    执行语句
2 Z2 i7 e1 [1 r  |# X+ W! k0 J0 B                   1.end; y! r: V, F  s; C& _

& T% d9 A( X; _+ v$ f7 f

$ C& w  \9 Z2 ]! @/ ^5 u* _
! Q6 L8 O( v; [  y4 D  p# z0 g2 M! @其含义是,当逻辑变量为1时,执行语句,直到逻辑变量为0,因此while的执行语句中,一定有改变逻辑变量的部分,否则就是死循环。比如写了while a<10,就一定会在执行语句中有类似a=a+1这样的赋值语句,使得若干次循环后,逻辑变量为0。总体而言,while并不如for稳定,所以初学者也可以无视while。

$ ]1 C1 b5 ^$ d* w. O7 X
. F$ s- K) p2 j7 d- y+ m9 s
5 l4 [7 H3 X, a6 ^2 i6 R' F
; ]" t3 n% ~/ G7 r; h: T

7 }) H; [* T+ l' _* B8 e$ Y+ f* z$ O: f" H6 J

( S+ K9 ]: n* w' T( R4 ^. `& r. U- v6 u

% x* L7 u8 s3 T0 V0 A; _5 F/ _/ e. L$ \7 E  k0 [/ |
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 01:34 , Processed in 0.171875 second(s), 27 queries , Gzip On.

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

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

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