|
|
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
|
|