|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 haidaowang 于 2019-11-14 10:35 编辑 ) B, ^* f9 k8 h; p2 z3 e
6 Y% B0 ]+ ~9 s- B5 I
6 {. |/ H. l" l! ?2 f2 g5 C判断常用于数学中的分段问题,更为复杂的问题则需要流程控制。本篇介绍matlab中的相关语法,这些语法并不难,但却很容易混淆,一方面是和其他语言,例如C语言混淆;另一方面是和matlab自身的其他语句,例如赋值混淆。, m; l: M- O8 b7 W) _4 X; b& s- g
* z9 T* Y+ ~5 K; b8 R7 }
1.逻辑变量8 ~/ z; r' c1 G, P' }0 p
1.1逻辑变量的赋值
; s% I8 B/ C/ e0 d, Q( `0 ?
$ l! M! F3 e: s* Y" j 有些语言中,逻辑变量是一种专门的变量类型,其值为true或者false,matlab中也有这个类型,但其值为1或者0。赋值方式是“变量名=表达式”,变量名的命名规则与数值变量一样,表达式是一种判断,比如数值大小的判断,或者高级函数的判断。例如输入0 f2 g& w8 W5 t) q7 Z
3 [$ l) Z# P6 ^6 `, U0 fa=1>2
, a$ p, g+ c6 K( P/ X: M+ X: e
& v( J( K4 U. B8 _$ ^就定义一个逻辑变量a,其值是0,表示false,在workspace里可以看见a的类型是logical。
5 `- c) W. f7 a% f! u% |- P/ d. F" j) q Q
! d, A( t9 J" x
0 @+ ]% I; K9 Z
# _0 H6 W' U6 X0 ?' H/ g 对初学者,可以认为数值大小的判断,是指两个1*1维的数值变量的比较。数值大小比较的方法有:>大于;<小于;>=大于等于;<=小于等于;==等于;~=不等于6种。因为数值计算有舍入误差,所以等于这个判断,有时需要用2 X; i7 z2 i" f- {# {0 I( t! c; o
( N, ?0 z1 c5 h# ]' |
abs(x1-x2)<eps
: m+ ~2 H2 p5 R/ ? T/ S
- Z3 p; {+ @2 O8 N7 l这样的不等式来代替,其中eps是matlab中最小的非零数值,相当于舍入误差的标准。9 l7 }' D. J0 N8 B& D' h3 F
' Q8 h _) f Y7 P
0 N% P) ~2 s; B) C1 E- V
高级函数的判断,是指系统自带的一些函数,例如( X8 E* H9 ^; h3 |" M
7 f. T H6 B$ l# Ma=isprime(x)
9 Z: A3 P4 c+ R* m" N; q
) Q: @, V6 V& U8 o8 W5 ~用来判断x是否为质数,
9 h" K# w5 h8 I, E0 N' [. i
1 E& V' j1 K& r4 oa=exist(x)* v! B @, c: F `/ J/ g
" q% [" q! D1 A" F* ]+ t* X) D用来判断是否存在变量、函数或者文件。1 N) L, s' i& o" d) B$ _! d/ w0 p9 M
* @2 J. I% k6 J# K& y1.2逻辑变量的逻辑运算' ~$ s: \% F5 \+ Z* f
: {" D8 m; J' h2 i0 }7 f逻辑变量的取值只有0或者1,他们之间可以进行逻辑运算,运算符有:&&与;||或;~非。这里需要注意:
9 f' d4 @3 C; j9 ^6 r' m' V) f8 p% h1)~单独使用表示非运算,要区别于不等于~=的连用
) J6 \$ _1 n) P5 \9 q; |+ Q5 X2)如果是高级函数的判断配合非运算,也可以实现判断,例如
0 `7 h6 Q2 ]/ p
# Y' p; }$ |2 _7 h+ F( L9 l- a=~isprime(x)
) N" H. z! z" C+ Q
4 V7 w* Q4 n6 O: c6 L7 P6 |5 H8 P; R( p
就相当于判断x是否为合数9 y# f' _/ b+ e5 L" N
1 t1 }* Y7 }; E# ~, {$ X1.3逻辑变量的数值运算, I2 [2 P" V- Y7 q$ R
# B# |% o& p. X9 P
matlab中逻辑变量可以参与数值运算,参与时,会被数值0和1代替。例如
- W7 l8 `0 B' r8 d! o
8 ]( [, J) N! [1 D2 a8 Q/ Za=1>2
7 t0 b: A' W( k# P7 v5 ^: S0 e; ^
0 `: r; k0 S! J- u生成一个逻辑变量a,则) j6 u0 G4 O$ s! @9 w
: X4 W6 _% G) Z# S' |8 U9 `2 ?
b=a+1! t7 B8 p' s5 L9 u9 K; h. D
1 W- s6 t2 @* \, y- _) f
时,matlab会判断正在进行数值运算,然后将逻辑变量a转化成数值变量,由于a在逻辑变量时表示false,所以转化时,a相当于数值变量0,因此会得到数值变量b=0+1=1。
3 _- l0 `7 y" l w+ C3 S) s; w+ j+ U
! i) r# d( e, A7 B0 |2.流程控制0 J1 M" x. v3 i. y& e) ]: w. j* `! n
A( f4 D% z, O: e. B" E
matlab的流程控制和C语言类似,if和switch作为判断依据,相当于流程图的菱形框,for和while作为循环,相当于流程图的反向箭头。
, r" j1 X/ W& o, C y5 c
: K) `$ |4 [) Z2.1if判断
: y9 }! I; {6 B5 a! R% O' n. x5 t4 k! ], @; b
语法是:
" P, A' b( y* j/ M$ H
; x& g9 i/ s1 j7 S! s- N& S8 Z9 P 1.if 逻辑变量1" X. ~1 C) X6 G/ t- G
1.执行语句1# ^+ Y7 a6 r' O! l& O
1.elseif 逻辑变量2
/ b" T F" L0 r9 ~; z# g- F" y* E 1.执行语句2
( l$ d* R( o, Z: ]3 F 1.else, l5 e- H0 n. B( h
1.执行语句3" } ]9 o# V8 Y v0 ~- U5 ?7 p
1.end* i( z+ v V, P2 ]$ k* u1 Q1 e
$ e7 j& a2 s' r" A! H2 F5 K
其含义与C语言中一致,是顺序判断,即逐个if或者elseif进行判断,若逻辑变量为1,则执行语句,若为0则进行下一个判断。其中逻辑变量经常用多个逻辑变量的逻辑运算结果来代替,例如我们经常看到的是
6 @3 i! N* T6 J4 Z# d3 n& [& p" P, m
- if x>1 && y>1
* j2 W. ?% G R/ p1 H; Y 5 J% [' W7 `$ {2 [3 [8 `2 N& \
, j$ Y4 q! t0 w8 C( I
而不是先赋值再判断的
0 y% w+ A. L; i( x) V# V" C1 R2 a4 y" U* V9 g3 V' B- _6 H# U
- a=(x>1) && (y>1)0 h3 ?" ?' c, P% n
1.if a
. m% G: D' T! a! ~) U: F5 i+ K# a, l
" s8 @0 F5 N* R5 z/ e5 q- ~0 f4 ~
: N- O) C# t8 S' y; T% E5 o4 `其实这两种方法是等效的。有时候为了书写和注释,也会先定义一个逻辑变量flag,然后再if flag。
$ w$ C/ |5 _8 P! K9 i3 b U$ T } A! o8 L
2.2switch判断9 w: ^# d9 ]* T% V* }% |8 J
k, O0 S; ~0 a J& i4 M0 O; u7 K' _ switch的语法是:) \+ w; W0 J) [ T7 |" K
1.switch 数值变量1
0 {+ P# x& ]& J+ \" L" O 1.case 数值1
3 L% V- f1 P, q- {9 @" @ 1. 执行语句1
; }. k' c) e5 [ 1.case 数值2
- M0 F; R6 H1 v T* T9 F% V. M 1. 执行语句27 ~1 p1 P) G/ L2 @ W
1.otherwise
( {( G2 `/ d7 v3 K 1. 执行语句3
4 T' Y5 z7 T. ~ 1.end6 w- {0 J) x- l7 ?$ f A, I
3 W6 {. O9 p# H" T h
switch与if最大的不同是,switch只进行一次判断,即根据数值变量1的值来决定执行哪一个case,而不像if会判断多个elseif。需要强调的是,只有当数值变量1==数值1时,才会执行语句1,而之前说过,==这个判断是有舍入误差的,因此switch一般用于数值变量1只取整数时,比如sfun的判断。对初学者而言,也可以先无视switch。
0 q' @: |, }3 S$ O5 h, z8 L: H/ ?% J+ o: s
2.3for循环% `! w s. c% g, v9 v
6 J" P" a& e8 }+ V2 t! \ for循环的语法是:
; M, |7 y2 |! G5 S/ Z5 N" C 1.for 数值变量=向量$ _% W/ _" X3 G: n! S9 P9 T9 Q. y' z
1. 执行语句0 ?; O* h/ N/ P
1.end ~3 Y4 |& ~- a6 S, h+ Q" y
& b) m0 ]; z# T$ Q, p$ v3 r
其含义是,数值变量会取向量中的每一个值,然后执行语句,在执行语句中,数值变量是一个1*1的矩阵。matlab中程序换行有两种方法,第一种方法,只能从第一行换到第二行,具体操作如下,首先在第一行中写完命令之后按下空格键,然后再按下数字键盘上的小数点键,小数点数目为3,之后按下enter键就可以实现换行。 ...+Enter;第二种方法,直接按住Shift+Enter键可以直接实现换行 D4 J$ o. \4 Q* u( b, ?; U
6 o; h3 g# v( q' i
for a=[0 1 3]5 I: Q% J, d# A R4 T/ V! p
6 A h: j( l ?4 o" ^则会让a=0,执行语句,然后a=1,执行语句,最后a=3,执行语句。这里容易和赋值语句混淆,因为a=[0 1 3]是一个数值变量赋值,赋值后a是个向量,但加上了for后,a是1*1矩阵。另外,在数值变量赋值那段,我们说过有一种常用的赋值方法是"a=初始值:步长:终值",其结果是把a赋值成一个向量,因此这也广泛用于for语句中. W: a! t& J- C; _ f; F3 t( L* f. B
( a, ^2 g( u& U# ?
4 ~2 v2 @- _! t% c" M
p/ C* W- s' a* ]2 H% h- for a=初始值:步长:终值. e* A% w1 H4 v+ D- r7 D/ `
- L* I1 }4 C7 |# @9 O( o" s1 Y9 ]3 B. X$ m3 T) N
则在执行语句中,a是一个遍历初值到终值的1*1矩阵。
& j/ u" g7 Z. k* x( {$ A1 ^
" P9 V5 u8 L& y1 f% h! `2.4while循环, }! p) _/ l2 z/ z0 q+ a
, U& v& ^( Y i( E$ H$ y
while语句的语法是:+ y5 F/ A) _& J( y' S9 }
1.while 逻辑变量
4 q4 b. o9 e# h; b( y6 B 1. 执行语句
2 Z2 i7 e1 [1 r |# X+ W! k0 J0 B 1.end; y! r: V, F s; C& _
& T% d9 A( X; _+ v$ f7 f
$ C& w \9 Z2 ]! @/ ^5 u* _
! Q6 L8 O( v; [ y4 D p# z0 g2 M! @其含义是,当逻辑变量为1时,执行语句,直到逻辑变量为0,因此while的执行语句中,一定有改变逻辑变量的部分,否则就是死循环。比如写了while a<10,就一定会在执行语句中有类似a=a+1这样的赋值语句,使得若干次循环后,逻辑变量为0。总体而言,while并不如for稳定,所以初学者也可以无视while。
$ ]1 C1 b5 ^$ d* w. O7 X
. F$ s- K) p2 j7 d- y+ m9 s5 l4 [7 H3 X, a6 ^2 i6 R' F
; ]" t3 n% ~/ G7 r; h: T
7 }) H; [* T+ l' _* B8 e$ Y+ f* z$ O: f" H6 J
( S+ K9 ]: n* w' T( R4 ^. `& r. U- v6 u
% x* L7 u8 s3 T0 V0 A; _5 F/ _/ e. L$ \7 E k0 [/ |
|
|