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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 haidaowang 于 2019-11-14 10:35 编辑 $ _  a! S1 h6 z7 A
; X  g( t9 w7 V! W3 q

9 r" ^/ Z- C( \' m判断常用于数学中的分段问题,更为复杂的问题则需要流程控制。本篇介绍matlab中的相关语法,这些语法并不难,但却很容易混淆,一方面是和其他语言,例如C语言混淆;另一方面是和matlab自身的其他语句,例如赋值混淆。4 }* n4 w, E. O0 h6 V0 h& I, x* I
4 t$ B. J. I. Z% ~9 J$ d
1.逻辑变量

9 a1 P  R, k# l0 z! Q: T6 B1.1逻辑变量的赋值
$ u( `$ J% [: Q* |; J
( q+ Y3 q& p. b% A. ?& n1 h8 V
    有些语言中,逻辑变量是一种专门的变量类型,其值为true或者false,matlab中也有这个类型,但其值为1或者0。赋值方式是“变量名=表达式”,变量名的命名规则与数值变量一样,表达式是一种判断,比如数值大小的判断,或者高级函数的判断。例如输入
" H0 G' Y6 C( r" F" ]0 _( `+ J% n" p* u% R; A
a=1>2% {- p; S2 V* }6 w+ T& V
4 J) p) m3 z% t! p+ ^, O
就定义一个逻辑变量a,其值是0,表示false,在workspace里可以看见a的类型是logical。
- L% ]' F1 R- P  ]4 I& V* F
7 K+ I' P! }; ?3 p

' ^* h. w3 g7 M% }9 Z4 X
  P# q6 ~" e' ]# J0 X3 [
6 X; e. y- l2 g$ ^  y    对初学者,可以认为数值大小的判断,是指两个1*1维的数值变量的比较。数值大小比较的方法有:>大于;<小于;>=大于等于;<=小于等于;==等于;~=不等于6种。因为数值计算有舍入误差,所以等于这个判断,有时需要用
/ g( v- }$ O# k3 \' H7 b0 @; D2 S% B# A! {9 x5 a: M
abs(x1-x2)<eps
4 @4 [: G- F4 @2 ^" \7 \$ W. c5 Y7 t# `# d+ u: g  z" Y* i+ {# e
这样的不等式来代替,其中eps是matlab中最小的非零数值,相当于舍入误差的标准。; Z. i0 x6 Q8 K7 B/ l
1 b7 x8 j' Z# M$ q% F5 b
8 l8 b# F9 l+ N
    高级函数的判断,是指系统自带的一些函数,例如+ ?( ]. l- m. c1 v
2 d) T2 C. x3 U
a=isprime(x)
0 [  ~9 w4 s* u8 l: ?1 D! ]( L0 L; k4 p
用来判断x是否为质数,. C3 a( |! Y5 |: }" c$ V
1 E. ~, M$ q& o. J
a=exist(x)$ w4 _; M0 O9 w  q' R' |
6 \$ K4 P2 f8 |  ?( l+ v( l
用来判断是否存在变量、函数或者文件。; _; `! J  h# v6 @, ]9 t1 x# F! t

) s! F& f: G4 t% p1.2逻辑变量的逻辑运算
% y" J( l! m! o" l
, W4 ~* o3 x' t' _
逻辑变量的取值只有0或者1,他们之间可以进行逻辑运算,运算符有:&&与;||或;~非。这里需要注意:" Q8 o' |# L/ x0 Z9 u+ q  r) Y& t% N
1)~单独使用表示非运算,要区别于不等于~=的连用# ?. L3 W3 n4 K% U% i2 s! E  A
2)如果是高级函数的判断配合非运算,也可以实现判断,例如! ]8 L* ^" f; v. v5 t1 Y* e+ N
7 i$ d; c( ?& z, I
  • a=~isprime(x)
    % n1 F+ t* Q# L# n' a8 A
% L, {$ n3 R* ?3 R, {. Z9 L: |6 h- H
8 S0 V  U9 @; U" U' ]7 D) k% c
就相当于判断x是否为合数; H' T4 }4 g! U% T) L

& Z& z7 k+ [$ i1.3逻辑变量的数值运算
% A  }- t3 o: X" v  @  a. w  y% v8 L" G. @
, o, C) l4 z; E* C/ f
    matlab中逻辑变量可以参与数值运算,参与时,会被数值0和1代替。例如. {+ G3 S. y% p, L2 V/ U4 O
% `3 N9 b; r2 ]% P
a=1>2
/ w' d( W( O1 W
, v* x/ v6 C2 J; q/ C% m生成一个逻辑变量a,则
7 p" T7 r! I6 ]. m5 \: Q
2 \( Q6 e) {1 s1 ]2 db=a+1; f# l: n7 e* n  l! k! x0 H+ t
  v/ @# t" O6 n  }# m( ^5 Z
时,matlab会判断正在进行数值运算,然后将逻辑变量a转化成数值变量,由于a在逻辑变量时表示false,所以转化时,a相当于数值变量0,因此会得到数值变量b=0+1=1。
  h" s9 W6 i/ u9 ~4 n( d
, K0 K+ P1 s; p$ [2.流程控制
: y8 S7 s. n! H' S8 P, v
8 a/ M* d! {) }8 s0 ?
    matlab的流程控制和C语言类似,if和switch作为判断依据,相当于流程图的菱形框,for和while作为循环,相当于流程图的反向箭头。

! ~* m$ A% l/ N  c3 p% ~# {1 v
6 T6 K; w0 v$ k# ]+ ^2.1if判断

7 |( k, J' u3 F) W$ f, e$ M" M5 ^
9 y. i, f8 N4 C4 o- H8 P5 Z    语法是:1 x$ V/ s% h6 Y2 o

" U1 b" Q. M6 m# v* f3 g    1.if 逻辑变量1
; l; _3 s6 I: A. s% M           1.执行语句1
9 V$ T1 |+ M. `, L( e5 G( H                  1.elseif 逻辑变量2
$ ^) a+ `% c: G8 d+ I: n                         1.执行语句2
! ~; z3 |2 f0 V7 {' ~. e                                  1.else
9 l2 V! H5 e  w: L9 }* z( q0 `' z% [                                         1.执行语句3+ [( `7 l0 @% W! Q1 [6 W
                                                 1.end

0 u8 N1 P. W- d- ~3 O6 D6 I) _; n6 Q7 K7 M/ ?2 u& o
其含义与C语言中一致,是顺序判断,即逐个if或者elseif进行判断,若逻辑变量为1,则执行语句,若为0则进行下一个判断。其中逻辑变量经常用多个逻辑变量的逻辑运算结果来代替,例如我们经常看到的是
# Y5 H: g" I5 h  p6 ^4 v& _: s8 T
  • if x>1 && y>1) J! g3 v* v$ n  {, o& `- d$ v  N

+ R8 G2 v; u" q: G
7 m" T" s5 |5 T5 r6 N6 S# P而不是先赋值再判断的
: h! f) m  o  ]5 ]
9 a. v, J- Y& w) r
  • a=(x>1) && (y>1)" S/ x+ p. U: F# K, ^+ T2 [
         1.if a2 L- O2 F8 Y% |+ r

1 [  U; O4 u1 U$ u5 x$ {7 P
% N2 ^7 L7 ?7 g

: t! D; @: d; L/ a/ \' u$ K其实这两种方法是等效的。有时候为了书写和注释,也会先定义一个逻辑变量flag,然后再if flag。6 j2 H+ R: F: u

/ r  [7 C% a( u. _  F2.2switch判断

8 J6 O: G) w* {8 m$ h
- r" N5 @, Q' v2 D5 A( `) X    switch的语法是:# P) Q! a. J8 w: h8 d' ^0 j
    1.switch 数值变量18 i1 }  I+ p, B" s; z8 g
              1.case 数值1
( G3 C/ I* n9 v, p% d' z  K' X                    1.    执行语句1
- k5 j& E, W' [& u8 D( ^                            1.case 数值2: G  Q" @9 {6 X* W2 D
                                   1.    执行语句25 m: z/ J' L( W2 }
                                          1.otherwise2 i1 |8 R/ C7 ?# j8 k
                                                1.    执行语句3' K! I# Y6 ~3 }8 y' A
                                                       1.end

5 b2 N4 s- T% T/ o
# K$ X# d$ R  p" j" |switch与if最大的不同是,switch只进行一次判断,即根据数值变量1的值来决定执行哪一个case,而不像if会判断多个elseif。需要强调的是,只有当数值变量1==数值1时,才会执行语句1,而之前说过,==这个判断是有舍入误差的,因此switch一般用于数值变量1只取整数时,比如sfun的判断。对初学者而言,也可以先无视switch。
) h/ U0 ^: w& ~$ ?, \) c# p
# X- o& L8 U5 m, D' R2.3for循环

( v' X/ P$ W1 S9 I+ R6 N
5 P" t8 B- Q) u2 {    for循环的语法是:5 }0 `, z9 C/ u8 `% y8 B
    1.for 数值变量=向量* c* v4 F6 O3 B9 q5 F' M
          1.    执行语句7 ^$ D. }! \; L3 T* s7 q! C
                 1.end

& |0 K) N1 H7 C0 g5 V
7 k+ F- g5 C) `/ J+ y" ]其含义是,数值变量会取向量中的每一个值,然后执行语句,在执行语句中,数值变量是一个1*1的矩阵。matlab中程序换行有两种方法,第一种方法,只能从第一行换到第二行,具体操作如下,首先在第一行中写完命令之后按下空格键,然后再按下数字键盘上的小数点键,小数点数目为3,之后按下enter键就可以实现换行。 ...+Enter;第二种方法,直接按住Shift+Enter键可以直接实现换行
: W3 M9 o* C2 O0 u+ B% v! n/ k/ f% C
for a=[0 1 3]+ E$ q3 f+ u8 u" J+ }5 F
- S* ]% I$ P& ^5 ?7 p; V
则会让a=0,执行语句,然后a=1,执行语句,最后a=3,执行语句。这里容易和赋值语句混淆,因为a=[0 1 3]是一个数值变量赋值,赋值后a是个向量,但加上了for后,a是1*1矩阵。另外,在数值变量赋值那段,我们说过有一种常用的赋值方法是"a=初始值:步长:终值",其结果是把a赋值成一个向量,因此这也广泛用于for语句中/ E2 o4 l3 d! M% u6 `
5 l0 |' D0 s8 r0 W
3 g) e2 X+ c0 q9 K4 f: F) g

8 Y( M4 h( l5 ~' a0 c0 N
  • for a=初始值:步长:终值
    : N. E" N: M$ g( p* X

: X  N4 N! D1 O6 _- M: W7 Q: d( Z  @5 I: d+ x4 M: I; W8 I
则在执行语句中,a是一个遍历初值到终值的1*1矩阵。
) f" ^: u/ w5 o9 Q# {, ^3 b& J$ `$ W8 C
2.4while循环

& O8 c0 x, ~( U& ^& u; c) H/ v/ y- w- _8 {( w4 J5 \* I8 o5 P" ]2 f4 g
    while语句的语法是:& R/ @$ o" @; R  Y6 y. u8 ?1 |6 i
    1.while 逻辑变量  w$ q* ~7 e5 p" S% j6 L' c
           1.    执行语句
3 N8 h- c, R! x# e  w                   1.end
( G2 e% R7 w8 A2 f7 l$ G
2 K/ i. e0 p: G3 r

- `, H7 E4 ^8 L0 ^
6 ?% ~# Y, ]) ]$ \! n其含义是,当逻辑变量为1时,执行语句,直到逻辑变量为0,因此while的执行语句中,一定有改变逻辑变量的部分,否则就是死循环。比如写了while a<10,就一定会在执行语句中有类似a=a+1这样的赋值语句,使得若干次循环后,逻辑变量为0。总体而言,while并不如for稳定,所以初学者也可以无视while。

& v4 V, l& |: h2 u& W. x4 m% Y
9 J% a  x  G2 O# F  A# m% A- }
2 \/ H# g: L: e

( b4 h% G$ _0 F1 B
$ u1 S; e  H/ f9 h9 e
) g2 I; M% ]- I) o& I5 K
: D6 B/ a! i% S% C6 f* L* ~
* u% [- W% _" F7 `! R' u2 \

+ s# M% q# q# f; {
- v, {" s. L/ \7 U2 o% b
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 19:56 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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