|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 haidaowang 于 2019-11-14 10:35 编辑
& Y5 n4 } R2 r; t# f9 t
4 W/ U) X8 [! X; T
* I7 E. O; s0 R) x# `7 [判断常用于数学中的分段问题,更为复杂的问题则需要流程控制。本篇介绍matlab中的相关语法,这些语法并不难,但却很容易混淆,一方面是和其他语言,例如C语言混淆;另一方面是和matlab自身的其他语句,例如赋值混淆。
p# z$ g9 [) G; L
7 {- ^* g9 @4 d1 f8 c# y1.逻辑变量
; D9 a5 l6 F& B+ J6 d- M# f3 q" R$ Y1.1逻辑变量的赋值' u5 K3 c+ e+ e2 l" E
% w! g3 i' M0 ~/ F 有些语言中,逻辑变量是一种专门的变量类型,其值为true或者false,matlab中也有这个类型,但其值为1或者0。赋值方式是“变量名=表达式”,变量名的命名规则与数值变量一样,表达式是一种判断,比如数值大小的判断,或者高级函数的判断。例如输入
2 O8 y4 P7 K: U/ x' e# p
- O- W! }- p, x4 H8 |% G# Ua=1>26 o8 ?, y+ e1 `9 U" N8 S
- u4 @8 x3 P, t7 {8 M
就定义一个逻辑变量a,其值是0,表示false,在workspace里可以看见a的类型是logical。 Y: _1 w5 ~2 G/ k2 l
4 T; Z. r M) v" Q* [& @
5 c) w% h/ x0 o9 j5 l, ]- E
: u1 S; y# ?( v% ?) [4 u# X1 q. g3 E0 k
对初学者,可以认为数值大小的判断,是指两个1*1维的数值变量的比较。数值大小比较的方法有:>大于;<小于;>=大于等于;<=小于等于;==等于;~=不等于6种。因为数值计算有舍入误差,所以等于这个判断,有时需要用
( i3 m( B3 {% t- ~5 A5 {+ X& s# f' c6 V3 H4 e
abs(x1-x2)<eps( B& q9 E& k) d/ A
4 m4 g5 m1 }, @. ^9 Q- R& @
这样的不等式来代替,其中eps是matlab中最小的非零数值,相当于舍入误差的标准。
7 v: L d% U1 ]+ b
8 m( T) r7 H& n4 _: K7 m7 v* U2 J! ~, F' b! x
高级函数的判断,是指系统自带的一些函数,例如# l) O. }. U: H7 t
# k* w; I2 U1 N+ s9 T
a=isprime(x)
1 G: _8 }8 i% D6 H9 t( y% _( T- r/ O* b7 a' z K l! ^' K C
用来判断x是否为质数,
" T) O( T5 Y! _, D7 y7 n, w x; i. ]5 t% L
a=exist(x)
) H; ]) n$ q' ~/ o; B: B0 B- j" z) ?7 y
用来判断是否存在变量、函数或者文件。& b. P0 F" z' Y S
- u4 n( e. L* N
1.2逻辑变量的逻辑运算8 \' { ^ ~* p9 k% b+ l
3 c) z1 T8 c; r. V逻辑变量的取值只有0或者1,他们之间可以进行逻辑运算,运算符有:&&与;||或;~非。这里需要注意:- |' D9 @: V% E2 g! a% J. h. i' j9 k
1)~单独使用表示非运算,要区别于不等于~=的连用' @8 w; l% k. q9 ?- S( Z9 \
2)如果是高级函数的判断配合非运算,也可以实现判断,例如# o2 C4 _) Y: [8 |# k2 `
3 C9 t" O& A* o- a=~isprime(x)! ^) g8 n! w& Q9 n% ?
5 | z" X! Q% I+ {0 `- m7 r
$ k7 I) U( s! l1 q* a4 S就相当于判断x是否为合数 b$ v" J/ k" a1 c. i' l! e) b. Y V
3 d2 }5 }0 O$ Z& q1.3逻辑变量的数值运算9 Z) [2 a+ _$ o; `
; d+ }8 [ M4 r% C! `; P1 |1 V$ {7 v4 s matlab中逻辑变量可以参与数值运算,参与时,会被数值0和1代替。例如3 G) v. w0 ]" _" G
7 }( `8 |6 I; o4 z7 E% L$ J: wa=1>2! z6 v" v% r `" ] `# w
" p* [5 p+ D2 y: k; E+ }1 h( w生成一个逻辑变量a,则
) _8 R, n9 L0 w2 i y! i- C. G" ~7 Q2 O
b=a+1
" j* n! k4 a' J2 ~% M2 H8 `% t3 v4 M- q3 Q; C
时,matlab会判断正在进行数值运算,然后将逻辑变量a转化成数值变量,由于a在逻辑变量时表示false,所以转化时,a相当于数值变量0,因此会得到数值变量b=0+1=1。
4 i, P7 S) B- n2 ~0 ?+ W- @" s# E& _8 K$ T: j
2.流程控制
J& G- R6 H" E# [! m+ N9 q% ]6 B% N; `0 V
matlab的流程控制和C语言类似,if和switch作为判断依据,相当于流程图的菱形框,for和while作为循环,相当于流程图的反向箭头。 y0 A& a% A7 z( k6 O9 U9 j' @, @
0 `$ O$ u: U' I( z7 b0 l% m- `5 z
2.1if判断' c( q* f, m. i& W: C; ?" V* N
5 l. E0 v6 @& {+ [6 g6 s, H 语法是:( C3 K* D0 y/ K! a8 H" s3 ]9 F
# L% B) d: P! `- T
1.if 逻辑变量1
# R5 {- p$ S" ]1 a 1.执行语句1$ K% p9 }. Z* W, o( N( i5 }. D/ R
1.elseif 逻辑变量2! s* \' Z! z- E% p
1.执行语句2
; w4 C3 X) N- y' t- v 1.else
y0 S& V, N/ r _ 1.执行语句3/ Q* Q7 ~ m- F7 k, S |7 I* _' \
1.end! A- A. |6 z! y* E; P$ V- y( |
* ~; k) {9 F/ o+ G0 q
其含义与C语言中一致,是顺序判断,即逐个if或者elseif进行判断,若逻辑变量为1,则执行语句,若为0则进行下一个判断。其中逻辑变量经常用多个逻辑变量的逻辑运算结果来代替,例如我们经常看到的是9 N8 d% o4 I9 X0 k+ S
8 k: u' L; w) O+ N* K- if x>1 && y>10 r, k5 O/ x+ `
7 s6 K6 ^5 q" z' f
. ?6 w- _" L0 n. M) _5 T' |8 W而不是先赋值再判断的/ x8 z+ A; }: U3 f5 @! n- X/ g* |7 u
' z& N* M, a3 Q5 M! c7 o
- a=(x>1) && (y>1)6 P* X2 S, G6 H7 ] H7 u
1.if a
' F; z5 ~; j! M1 w, {0 V% \* G3 M" i, |
" i( f5 k; s6 f9 E
! n; S5 {# G0 D: q0 V, w其实这两种方法是等效的。有时候为了书写和注释,也会先定义一个逻辑变量flag,然后再if flag。
$ z6 t) f# S+ }* H& E# |9 Q/ T+ ~. M% E4 M0 @0 H& X
2.2switch判断/ `4 d% R/ Z* t9 q6 E5 f- K5 \
/ q. P( `1 z2 E9 v9 a9 A) G9 _7 I switch的语法是:5 x" B) C; P) E) T S
1.switch 数值变量1
& ~# \+ e* i6 |5 C; P% ?* s I* s 1.case 数值1
- ^* A B9 [) x7 T1 @ 1. 执行语句19 E* j4 F0 X. b: i
1.case 数值2: x7 t a$ `$ w4 T9 r; ]3 ?7 A9 g
1. 执行语句2
" I* ~: }6 y* O9 M ]4 n" F 1.otherwise
2 K9 Z- I5 e) P 1. 执行语句3$ T+ G3 a, o7 ?, |& k) P
1.end
" @& u% s7 R! z* a. z" A) k1 ~: g5 l5 U
switch与if最大的不同是,switch只进行一次判断,即根据数值变量1的值来决定执行哪一个case,而不像if会判断多个elseif。需要强调的是,只有当数值变量1==数值1时,才会执行语句1,而之前说过,==这个判断是有舍入误差的,因此switch一般用于数值变量1只取整数时,比如sfun的判断。对初学者而言,也可以先无视switch。
2 [3 m% D: u! }" Y+ m5 s3 T9 b+ o6 v. r7 G6 M: p2 x& Y
2.3for循环
) X! S2 j+ z' T( [$ U5 C5 G8 t! o4 m) j7 V5 n# Y
for循环的语法是:9 e( Y) [1 E: ?6 k+ l4 T
1.for 数值变量=向量
# v- e3 Q& R* u$ ^$ R0 r( i 1. 执行语句
% p+ p9 P4 }) l6 F( M; [& f 1.end
F& ^- m8 [: X+ \1 W# p; X6 u4 x" v2 S
其含义是,数值变量会取向量中的每一个值,然后执行语句,在执行语句中,数值变量是一个1*1的矩阵。matlab中程序换行有两种方法,第一种方法,只能从第一行换到第二行,具体操作如下,首先在第一行中写完命令之后按下空格键,然后再按下数字键盘上的小数点键,小数点数目为3,之后按下enter键就可以实现换行。 ...+Enter;第二种方法,直接按住Shift+Enter键可以直接实现换行
, @! R. X8 L" `7 H B* V: v& x2 L a
for a=[0 1 3]+ g5 T+ K( A( M3 a
5 h! Y+ M; @% I
则会让a=0,执行语句,然后a=1,执行语句,最后a=3,执行语句。这里容易和赋值语句混淆,因为a=[0 1 3]是一个数值变量赋值,赋值后a是个向量,但加上了for后,a是1*1矩阵。另外,在数值变量赋值那段,我们说过有一种常用的赋值方法是"a=初始值:步长:终值",其结果是把a赋值成一个向量,因此这也广泛用于for语句中
: ~( D* t, Y' q" u d0 \2 y) ?# s$ K, @3 n: N% b
4 n W) t4 |. Z4 ?! o
' m/ M. P, J" p- for a=初始值:步长:终值
/ {5 n! g1 o: ^& ^* R/ W& G
* m4 v: `# L! }0 B* |
! U0 J, ~; O& \/ l( i1 |: v6 C; v则在执行语句中,a是一个遍历初值到终值的1*1矩阵。
5 `$ p2 e) s" e& i( x L
- Q H0 U, q9 j8 N9 M6 x# R; M2.4while循环+ V8 q; ?3 _. x5 ^+ @4 V
, E3 l1 g& }, r3 c! r& l& i while语句的语法是:
: ^0 S/ c) L/ J# V; t 1.while 逻辑变量
4 `9 ~! W" W+ P" j- R 1. 执行语句
0 d0 j6 M( w8 O3 F8 k. l% o8 o 1.end
' }5 f1 G4 t4 t) A, D
; b; }6 G' A1 a" R7 z; c
3 F# p8 {/ a* J- ~# C0 K9 n3 B- W) B. |. w( o. J
其含义是,当逻辑变量为1时,执行语句,直到逻辑变量为0,因此while的执行语句中,一定有改变逻辑变量的部分,否则就是死循环。比如写了while a<10,就一定会在执行语句中有类似a=a+1这样的赋值语句,使得若干次循环后,逻辑变量为0。总体而言,while并不如for稳定,所以初学者也可以无视while。# v) }! J+ M* b- b: f$ z2 Q
$ p# [1 R' J! }- `8 X' e( J1 m: d" B. J9 M& E0 L/ N
4 q. @: B/ }) c+ r! X
3 i, `: n% Z7 F3 ^4 H- [; S
5 p# y( I) S+ }. a1 h& T+ Y) r6 Z' l0 g: o
% @3 v$ k& R' S4 g: i$ ]" t0 e8 t
' R) r$ E! r. A% @# X" F* C2 v3 Z* C7 _: f, C0 c
|
|