|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 haidaowang 于 2019-11-14 10:35 编辑 / }4 Q% }! _9 g0 _1 d7 R
2 G; B1 {0 m2 R
( Y8 ^+ _, x( {判断常用于数学中的分段问题,更为复杂的问题则需要流程控制。本篇介绍matlab中的相关语法,这些语法并不难,但却很容易混淆,一方面是和其他语言,例如C语言混淆;另一方面是和matlab自身的其他语句,例如赋值混淆。
7 u. T' W2 c. S
$ ]& v. x( X' A) r; I/ l1.逻辑变量
, F4 [: \" ~0 B* I, C- Q; h# z1.1逻辑变量的赋值
a& m) n$ Q9 |& d% n
( |% q( x% d+ J0 U! p0 b 有些语言中,逻辑变量是一种专门的变量类型,其值为true或者false,matlab中也有这个类型,但其值为1或者0。赋值方式是“变量名=表达式”,变量名的命名规则与数值变量一样,表达式是一种判断,比如数值大小的判断,或者高级函数的判断。例如输入# ?$ ?3 }8 @, |8 ?8 N
& B) B! h6 w- b
a=1>26 ^' X2 b6 w0 z5 [( X
+ s. i& L. R. I' T0 o0 \# i4 C就定义一个逻辑变量a,其值是0,表示false,在workspace里可以看见a的类型是logical。- j# U- b) n3 p3 k i
/ p4 g2 J v0 Y9 ]4 k& m X; i
6 t; f. _! |6 Z/ i3 ^1 q% d0 `- ^7 T! E$ Y* k: B! q
! w; b% G' E8 {. X% b
对初学者,可以认为数值大小的判断,是指两个1*1维的数值变量的比较。数值大小比较的方法有:>大于;<小于;>=大于等于;<=小于等于;==等于;~=不等于6种。因为数值计算有舍入误差,所以等于这个判断,有时需要用0 a, N5 U' w) d; M
( c% b, C- z7 G( M6 U
abs(x1-x2)<eps
7 j0 w, S6 Y5 `, m& r+ x- r! y! c+ `$ u
这样的不等式来代替,其中eps是matlab中最小的非零数值,相当于舍入误差的标准。8 q E0 `' w1 X
: }& n( X8 C6 v0 g5 \) j; b& E9 Z
高级函数的判断,是指系统自带的一些函数,例如: _1 o2 o+ u( @0 _" ]# i" [
7 Q0 U# m; B4 w/ Ua=isprime(x)
) N/ X4 w2 |$ n) [% X+ c1 W) x" ^
用来判断x是否为质数,
9 b( \0 ]: F4 A$ J+ S' \0 b4 b( |+ j5 U" y8 Z; f- c% V
a=exist(x)
& O) i0 M0 a1 v9 u
" P3 X$ J+ g1 z' R5 d用来判断是否存在变量、函数或者文件。
( |" P& L& T) [+ H I0 p; T' g3 X
( V; {% B$ v1 s, o- O1.2逻辑变量的逻辑运算6 X" ~1 D+ d) w) C
* R3 v' z/ i* i" c逻辑变量的取值只有0或者1,他们之间可以进行逻辑运算,运算符有:&&与;||或;~非。这里需要注意:
/ _' C% g# |+ q1)~单独使用表示非运算,要区别于不等于~=的连用' P: X8 u2 G. _7 p O* @
2)如果是高级函数的判断配合非运算,也可以实现判断,例如4 I( b6 M' O# l( h) O
6 S. J7 L% X) j. V# ]- O0 @- a=~isprime(x)* i" n% `" \, F0 D
0 F% R2 G# n* s( P( ~$ O( S& }
+ H$ g/ I' n k+ ^& n! d就相当于判断x是否为合数4 Z2 Q/ c, u- \
9 C4 M7 t P) q% F
1.3逻辑变量的数值运算# h, K2 p) [8 M9 B h0 X
! \+ w# q: O" R matlab中逻辑变量可以参与数值运算,参与时,会被数值0和1代替。例如. W( h6 C* ?9 ?. U# H
7 l+ j* j+ t& x% Y
a=1>2
- {1 ` B' d) p; t1 k- j/ j/ p: h
/ w7 Y+ ^4 v. F# s- {生成一个逻辑变量a,则
2 R' [1 y* L; `$ Z$ K* {
5 {5 m$ J; {# A; }0 Nb=a+11 B ^+ ]1 M% n# o; B
' g" M9 ~2 Y3 y- a" s2 u时,matlab会判断正在进行数值运算,然后将逻辑变量a转化成数值变量,由于a在逻辑变量时表示false,所以转化时,a相当于数值变量0,因此会得到数值变量b=0+1=1。
8 Y3 z/ i9 u5 |; G$ h( o
7 l- M2 ^2 u4 p: [ A7 ~/ L1 ?& ~2.流程控制% D3 h& O k" B; ]( g6 R
+ o$ _+ U9 v& {) Z! a9 R matlab的流程控制和C语言类似,if和switch作为判断依据,相当于流程图的菱形框,for和while作为循环,相当于流程图的反向箭头。
8 x) w. t" p1 T* T$ H$ b, C0 T/ g; `; G) H0 u; F* O4 V/ V
2.1if判断
& a0 H4 i0 D- A( V, k, j0 c6 D$ [$ F9 S0 t% P
语法是:( N2 u l" d& O1 q h6 j3 R. n3 N0 F
0 S3 I; ~: b* t* J; o2 i6 j& G
1.if 逻辑变量10 j; y. |" h& A$ t7 H- A' t. k9 k
1.执行语句1# q5 O+ V/ ?6 Q7 {+ D" }
1.elseif 逻辑变量2- f; i# k& [$ B
1.执行语句2
$ b8 s& s" i6 ^8 v0 A/ H 1.else
) L! ]2 U* j3 L 1.执行语句3# }+ L0 a2 N/ ]# b
1.end6 [# Z0 |8 p# G) S0 N
! R: ^) h) l* g; n5 S其含义与C语言中一致,是顺序判断,即逐个if或者elseif进行判断,若逻辑变量为1,则执行语句,若为0则进行下一个判断。其中逻辑变量经常用多个逻辑变量的逻辑运算结果来代替,例如我们经常看到的是
U/ I) V+ l7 M6 Q% n% k7 U
& S3 ?/ z0 A* Z3 \+ S+ m$ F- if x>1 && y>1
# G: x' m( B7 L1 p1 W
- m% k ^: W% o/ g N+ l0 T R0 k5 m1 v
而不是先赋值再判断的- U5 W( }3 ~' `1 Z
! C4 E& G4 U) S+ B5 n- a=(x>1) && (y>1)% w# A. e8 a1 H
1.if a) i& N$ {. m @* }8 o$ Y
" c! |+ ?; |% W8 ]- K! T
2 y5 P2 U- Y) ]$ K. @7 a; U i2 R% u5 H3 I O
其实这两种方法是等效的。有时候为了书写和注释,也会先定义一个逻辑变量flag,然后再if flag。* R& ~0 w8 p; O( |( r" s
# _2 z4 u+ `" e) N
2.2switch判断
6 y& E7 ~0 G7 D& e* o! b8 r2 D5 @1 t$ r
switch的语法是:
( e. B2 J8 I" l8 h' P8 n 1.switch 数值变量1' ~' z/ H# |% N1 ^( A& B5 s
1.case 数值1+ N8 _* w) @8 ?; }( ~* a
1. 执行语句1
/ a. d% A/ L* F) c& Z! w7 A* z 1.case 数值2
' n3 b" G0 l6 B0 W: H4 s% q3 s 1. 执行语句2: s0 n) r* d9 h6 f0 _' ]
1.otherwise
+ ^3 u3 }' O2 ^1 m 1. 执行语句3! n$ i$ D4 N; v* E8 Q$ A
1.end
8 |- ]! p! c5 k9 M" S+ A$ Z* m! h, G8 E, ?2 D
switch与if最大的不同是,switch只进行一次判断,即根据数值变量1的值来决定执行哪一个case,而不像if会判断多个elseif。需要强调的是,只有当数值变量1==数值1时,才会执行语句1,而之前说过,==这个判断是有舍入误差的,因此switch一般用于数值变量1只取整数时,比如sfun的判断。对初学者而言,也可以先无视switch。
9 s8 ^7 Y/ F' G9 d: K1 b- U. O" ]% r; m1 O) u6 M' L
2.3for循环
/ z5 Y4 }3 P5 Q8 ]( c& g
2 v( F: r# Z/ _, r: }: K for循环的语法是:
: h, B5 b7 H4 l+ d- h# N. U! W 1.for 数值变量=向量
6 ~2 a7 y; a% r' q: h 1. 执行语句2 G1 w% V& v# s6 o. [
1.end
. Z. Y5 I% U1 h; q" Q' Z& j
0 s9 I0 |4 a- g* m$ }' H3 v6 v其含义是,数值变量会取向量中的每一个值,然后执行语句,在执行语句中,数值变量是一个1*1的矩阵。matlab中程序换行有两种方法,第一种方法,只能从第一行换到第二行,具体操作如下,首先在第一行中写完命令之后按下空格键,然后再按下数字键盘上的小数点键,小数点数目为3,之后按下enter键就可以实现换行。 ...+Enter;第二种方法,直接按住Shift+Enter键可以直接实现换行
, s) g' D( b7 z& Z8 l8 _5 H+ g/ T1 ?7 z C6 B
for a=[0 1 3]; [8 e; Z9 C. I l- Z
4 x9 B) b x9 N; |( h, y
则会让a=0,执行语句,然后a=1,执行语句,最后a=3,执行语句。这里容易和赋值语句混淆,因为a=[0 1 3]是一个数值变量赋值,赋值后a是个向量,但加上了for后,a是1*1矩阵。另外,在数值变量赋值那段,我们说过有一种常用的赋值方法是"a=初始值:步长:终值",其结果是把a赋值成一个向量,因此这也广泛用于for语句中
; r# {2 d5 A$ e( J& }, C# t
0 o5 A+ p2 o" A) v* P
% v8 A1 g H. C& g2 N. O& {6 c9 d6 d6 ? A" u( p' {% M
- for a=初始值:步长:终值
! L4 W) k5 J, i+ S # u5 b+ o+ N" N" h# l& b4 ]" F! k
/ G& C( Y- L) ^7 r9 y# P9 {
则在执行语句中,a是一个遍历初值到终值的1*1矩阵。
- X0 @! K6 g6 _* W6 x; D: O$ u% W* x$ V N1 `- u* c6 m
2.4while循环
! u B- k$ Z1 K+ {; l
5 S# E# G6 A4 p+ p6 U. w0 @& L while语句的语法是: A9 Z! W7 q0 W" n7 O
1.while 逻辑变量% c- l: f( L0 k
1. 执行语句
5 E2 m6 u: B: {6 o# j) U 1.end
, U$ l- U5 O' _+ F7 g. x/ u9 k6 X
- L0 h9 H- U: Q; B
! |* k( G5 L2 ]9 z6 B( ~& b
3 Z( ?3 n- F7 G& T3 {其含义是,当逻辑变量为1时,执行语句,直到逻辑变量为0,因此while的执行语句中,一定有改变逻辑变量的部分,否则就是死循环。比如写了while a<10,就一定会在执行语句中有类似a=a+1这样的赋值语句,使得若干次循环后,逻辑变量为0。总体而言,while并不如for稳定,所以初学者也可以无视while。
' d' O3 s8 j4 }
' A2 O6 J& b# T6 c$ k- W6 l
: P) h$ E- S4 @! M& S. W7 w2 A
7 M8 C6 G3 G4 B% c' K' N% _5 h/ d; a1 n; }
! M$ i, k. r. x7 D$ A
. T6 ]8 |9 Y* Z+ G+ m
1 ]4 V# L: t: @* U* {, R6 Y) T
+ q0 q) y1 e6 x) u8 T* P( f$ F2 m( C* |$ |
5 |4 ^7 c$ y6 Z, D |
|