|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 haidaowang 于 2019-11-14 10:35 编辑 ( _1 c- t8 E% {
$ l! y3 U+ c& S5 Y( C2 j! y% {: F7 J/ l* _
判断常用于数学中的分段问题,更为复杂的问题则需要流程控制。本篇介绍matlab中的相关语法,这些语法并不难,但却很容易混淆,一方面是和其他语言,例如C语言混淆;另一方面是和matlab自身的其他语句,例如赋值混淆。
+ z* [, s! S( k3 L$ u: v" N. i8 I) l
2 [2 a! r' h# }& v* N1.逻辑变量5 m" t4 Q% O8 `3 e4 @8 T3 \ Z9 [
1.1逻辑变量的赋值* E. Q5 |# e2 e4 ^, o
: h0 j+ d9 G/ I+ Z2 o1 I* G( t+ \3 V 有些语言中,逻辑变量是一种专门的变量类型,其值为true或者false,matlab中也有这个类型,但其值为1或者0。赋值方式是“变量名=表达式”,变量名的命名规则与数值变量一样,表达式是一种判断,比如数值大小的判断,或者高级函数的判断。例如输入
+ f# c4 j( Z. V0 V9 t% E6 S) [. s" S' z) J
a=1>2
: P* p, Z' e3 O% r" o9 N
7 t* Z& R j L/ @$ ~ v7 e就定义一个逻辑变量a,其值是0,表示false,在workspace里可以看见a的类型是logical。2 a+ p8 h' M: N8 X$ X# ~5 t
& f1 f+ D' B3 \! z0 t- P1 V
; C7 R3 ~% C( i# n. q
, ]. f6 C2 C( l. n" f) |; c8 q3 w* B9 R; C
对初学者,可以认为数值大小的判断,是指两个1*1维的数值变量的比较。数值大小比较的方法有:>大于;<小于;>=大于等于;<=小于等于;==等于;~=不等于6种。因为数值计算有舍入误差,所以等于这个判断,有时需要用
( S) f0 o7 x1 L( d0 y9 m- r K" u5 {( O
abs(x1-x2)<eps
. y g) S4 T* V# F
+ M2 ^9 ~1 G; q! s: X- |- t这样的不等式来代替,其中eps是matlab中最小的非零数值,相当于舍入误差的标准。- }- M$ P3 Z6 j! J7 |" Z6 A
* j" u0 g" |5 R0 i
5 S' q2 E% @1 M. C6 y0 Q+ l 高级函数的判断,是指系统自带的一些函数,例如5 z' q% M! b1 C( B, q
- a& [- P- J+ Ma=isprime(x)
. d" I, e' r1 z# R# v! J4 m+ Y! Q; b V6 P$ L h7 C
用来判断x是否为质数,
$ }& i6 p5 O3 q" H; r$ m
- _3 f% i0 B5 c( r/ na=exist(x)
2 N: G1 W5 I! }$ T# x( G- ]9 H: [5 N+ K( G0 A% z2 L/ ^
用来判断是否存在变量、函数或者文件。
3 ^/ z' I: x8 C& j+ X
" y) u+ W# k8 Z; W8 v+ q1 ~6 _4 G5 k1.2逻辑变量的逻辑运算
1 b1 S- C7 p3 [: ?; A
* F* t5 P! I1 y逻辑变量的取值只有0或者1,他们之间可以进行逻辑运算,运算符有:&&与;||或;~非。这里需要注意:
) k1 H. c9 Y3 B) Q3 A5 X2 r1)~单独使用表示非运算,要区别于不等于~=的连用( K) Z8 h* c; s! M* y. O% u
2)如果是高级函数的判断配合非运算,也可以实现判断,例如4 X* C, q, ]6 L5 K$ G* ~& b. V
" H% h+ K6 u1 M8 q: K, x$ a+ X g- a=~isprime(x): P9 x' E7 |* X9 @9 I# Y
9 C2 B; Y3 V+ E+ N7 T% d
* p, S, ]2 g+ s& ]" O+ t6 M
就相当于判断x是否为合数, D8 A5 \: [- L* a
( g1 T& Z8 K0 W, R- n1.3逻辑变量的数值运算$ m- |" ?3 w, A3 w
, J# L! `# t6 Z$ Z' o; v! m matlab中逻辑变量可以参与数值运算,参与时,会被数值0和1代替。例如
5 h& {7 P: {5 t, L- t4 V C6 _- W! d! R) p6 s
a=1>21 B7 p0 X. Z" C
6 [" m# } P& p" \3 N- D生成一个逻辑变量a,则
, ]. m g# G8 ~2 Y F- S! D7 P* j4 ~2 x$ [( I7 G" k3 A3 P5 Y
b=a+1& u+ I6 [6 k: t# l$ i
# {, V1 g( N( b2 v, z. n时,matlab会判断正在进行数值运算,然后将逻辑变量a转化成数值变量,由于a在逻辑变量时表示false,所以转化时,a相当于数值变量0,因此会得到数值变量b=0+1=1。
8 @3 q; X6 k. Z: T4 d" k! q: u$ [/ \" k2 Y) U% F9 ?* Q
2.流程控制
8 \4 c; h; s0 S8 [5 B! c' I- E3 r. k0 a! J; \/ `
matlab的流程控制和C语言类似,if和switch作为判断依据,相当于流程图的菱形框,for和while作为循环,相当于流程图的反向箭头。
& n$ U! F% f) H) G" I
% b4 S3 t1 E1 M7 ]2.1if判断
2 O; o2 H3 }* L% K, s: l$ G1 N* c2 z/ S
语法是:
; z' k1 _+ q! M# ^
1 B" F$ x( s2 D 1.if 逻辑变量1
8 W5 Q/ N4 Y4 I( f% p5 D2 k% P 1.执行语句1
7 t* A7 W' s. e6 N 1.elseif 逻辑变量2
9 j4 X- k$ c0 H1 V+ g, r# i 1.执行语句2
- T' p; _5 n% M3 G& U7 @2 v 1.else2 |1 a" R8 j: p ]% j9 D* U
1.执行语句3& ~. d" M% \" D4 E
1.end1 w# T0 k+ o6 }# l+ X
; W. e3 [/ `& F& E5 G f
其含义与C语言中一致,是顺序判断,即逐个if或者elseif进行判断,若逻辑变量为1,则执行语句,若为0则进行下一个判断。其中逻辑变量经常用多个逻辑变量的逻辑运算结果来代替,例如我们经常看到的是, V4 \# j% J) T1 g
& |, |3 B8 B# e/ O6 l) Q- j
- if x>1 && y>1
- i0 i9 t% _& I, ~% | % j- b1 Q: @! K' [& m# _' |
: d* c% } x3 i4 A3 K* j- m而不是先赋值再判断的' A+ y3 b0 f Z, U7 V3 s7 ?
1 z" _$ M. ~# l1 m
- a=(x>1) && (y>1)
+ b7 B) P8 I0 w( Y0 C# D8 X- R: h 1.if a
: t; K' }8 J0 i; I6 \( H. o0 x2 M9 ]3 h9 b7 [; e/ G) E7 O5 l
3 E1 v) J! t- ~- K2 d7 {3 ?/ ]3 V6 B! G. o/ P5 e
其实这两种方法是等效的。有时候为了书写和注释,也会先定义一个逻辑变量flag,然后再if flag。: [5 T4 {3 f% q: l+ f2 [' N
" s: u" w8 P9 G( y" T2 _% j1 k
2.2switch判断4 h1 T- s! R* @' q
7 d, K2 F& L. v1 {/ @' C switch的语法是:$ t' o6 @8 y7 P
1.switch 数值变量1
. N: P+ T4 C9 N$ \; F% i 1.case 数值1
. y0 l% T) U9 Q8 O- w" X9 s 1. 执行语句16 u& i% h* ~+ Y
1.case 数值2! F3 c: S' q3 A! `) u/ V f5 f
1. 执行语句2
8 }) U% j( F7 R 1.otherwise; U5 d4 H& H& {
1. 执行语句3
! k3 i+ ?: j. w3 A: q0 q' T 1.end
2 i8 M% a& s1 m* g" V$ u3 \4 \) e9 A3 c2 o
switch与if最大的不同是,switch只进行一次判断,即根据数值变量1的值来决定执行哪一个case,而不像if会判断多个elseif。需要强调的是,只有当数值变量1==数值1时,才会执行语句1,而之前说过,==这个判断是有舍入误差的,因此switch一般用于数值变量1只取整数时,比如sfun的判断。对初学者而言,也可以先无视switch。
; [' l+ j( Q# u% E: E. A
) a$ m- ]; {2 s* x2.3for循环7 R: ^1 a9 i6 A. L
' m3 e' d3 P# q2 d for循环的语法是:
1 z. A1 e F6 O" ]& Y 1.for 数值变量=向量3 _' J4 |/ Y; f% a l" a
1. 执行语句 s- g8 D! H2 _! j& p0 P
1.end
7 [' H1 s* c% v, H9 L. Q/ _7 h% M9 \
其含义是,数值变量会取向量中的每一个值,然后执行语句,在执行语句中,数值变量是一个1*1的矩阵。matlab中程序换行有两种方法,第一种方法,只能从第一行换到第二行,具体操作如下,首先在第一行中写完命令之后按下空格键,然后再按下数字键盘上的小数点键,小数点数目为3,之后按下enter键就可以实现换行。 ...+Enter;第二种方法,直接按住Shift+Enter键可以直接实现换行
8 \; h% g) ~) s# O5 H% R7 O) H) }( c# O
for a=[0 1 3]6 V% x( G$ E7 I
H# C: i: M" v {9 F3 s+ l$ c5 S则会让a=0,执行语句,然后a=1,执行语句,最后a=3,执行语句。这里容易和赋值语句混淆,因为a=[0 1 3]是一个数值变量赋值,赋值后a是个向量,但加上了for后,a是1*1矩阵。另外,在数值变量赋值那段,我们说过有一种常用的赋值方法是"a=初始值:步长:终值",其结果是把a赋值成一个向量,因此这也广泛用于for语句中
* w4 ~; p& ~: m% c" H7 j5 ]# R# E- E% F9 N/ t! P
; a! q c; w, O2 |# Z/ s8 m P" p- }$ ^; v/ n
- for a=初始值:步长:终值+ p' I& w- ]2 z) R: L+ E
* P R/ r$ V% d6 [
. f+ L" g$ s* w* Q0 j$ W则在执行语句中,a是一个遍历初值到终值的1*1矩阵。# v1 U1 [8 i8 U, i: [
* j& g/ _7 B7 [# _* F- @% m
2.4while循环" N* F1 g8 K) O" X+ S) z4 O: o' m
p4 L9 v$ [% l( i
while语句的语法是:; v$ I7 ?+ l/ n; F9 |/ U
1.while 逻辑变量
9 |/ D1 @; b% _1 t e4 [+ C 1. 执行语句. j7 Z% g, T" r0 @$ {& K$ Y B
1.end
$ H3 D$ p: j5 L0 t+ s$ `% b& h9 F. {4 {
7 B k' `6 V' | n7 T3 i1 y
0 L5 T. ]6 Y8 s. u }其含义是,当逻辑变量为1时,执行语句,直到逻辑变量为0,因此while的执行语句中,一定有改变逻辑变量的部分,否则就是死循环。比如写了while a<10,就一定会在执行语句中有类似a=a+1这样的赋值语句,使得若干次循环后,逻辑变量为0。总体而言,while并不如for稳定,所以初学者也可以无视while。' T) w" y; X- g" {$ y' V
6 g# n0 ^5 K" B; [/ N6 ~% O* b
6 S) D+ y% b1 m4 T( r( I
- l5 O; @/ P, L* `6 v' @7 Y
; r9 P7 g/ I; \0 y' A8 z
% S4 O+ J* n9 c- F/ h7 {4 U3 B
) Y V9 ?/ O$ N9 l$ r5 p! |2 N' P# ~6 ~9 m- e; @
: u5 f7 [, P+ Q1 e
|
|