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