|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 haidaowang 于 2019-11-14 10:35 编辑 ) u/ r5 _% f2 `# _3 \8 `. a/ x
, |" B* l: t+ N, I: [, B
u. p' d+ {) V0 y8 i1 ]判断常用于数学中的分段问题,更为复杂的问题则需要流程控制。本篇介绍matlab中的相关语法,这些语法并不难,但却很容易混淆,一方面是和其他语言,例如C语言混淆;另一方面是和matlab自身的其他语句,例如赋值混淆。
. X1 c! y8 t, |( l/ T
7 q4 d- B# j- X$ _* l2 y1.逻辑变量
: q3 b, V3 g! x8 `2 n5 b1.1逻辑变量的赋值
* c; M* W2 R& |3 k6 N4 v
; h( W& j6 h, A 有些语言中,逻辑变量是一种专门的变量类型,其值为true或者false,matlab中也有这个类型,但其值为1或者0。赋值方式是“变量名=表达式”,变量名的命名规则与数值变量一样,表达式是一种判断,比如数值大小的判断,或者高级函数的判断。例如输入) [4 J8 H! r. v' U, a' f) ?- ]
3 V' l3 M7 _1 X$ r
a=1>2
: K4 S3 @* Z# `1 j) g2 e
$ m- P$ C9 N: e! X/ i就定义一个逻辑变量a,其值是0,表示false,在workspace里可以看见a的类型是logical。- t0 Y. y' m# D4 M( x
4 l! a8 F$ W' A3 _4 {; @" o
; K7 p4 U# j; ~) S+ n2 t0 E5 w; E, h) Q
) b. t+ ?3 G8 A+ Q6 F; a' X3 @1 t1 _. Q" ^2 n
对初学者,可以认为数值大小的判断,是指两个1*1维的数值变量的比较。数值大小比较的方法有:>大于;<小于;>=大于等于;<=小于等于;==等于;~=不等于6种。因为数值计算有舍入误差,所以等于这个判断,有时需要用
1 k- J; u& j3 h$ t( m3 E6 _! r/ G4 Z( M8 n7 S; F
abs(x1-x2)<eps
9 o% x; l1 a8 v5 c
8 t' b( J! v2 q& y3 u这样的不等式来代替,其中eps是matlab中最小的非零数值,相当于舍入误差的标准。) v4 N+ B3 ?- X' V' n
" t4 y. ] ~' Z1 d+ ~& _+ W# U8 Z
高级函数的判断,是指系统自带的一些函数,例如
& H' c8 L& m8 D4 G+ E! ~4 G
! j/ {8 G: U3 Z9 ~* n4 }2 _; Ta=isprime(x)
* i E' D1 M, T* W7 I( m, `9 c% H+ o0 [9 R8 H
用来判断x是否为质数,1 G3 s. M8 i$ i- m2 } }0 S
# @- P* i1 Y K8 O: g
a=exist(x), r$ S5 r& h) g: _8 T6 v
V7 C5 L# O4 Q/ Z# V+ Q
用来判断是否存在变量、函数或者文件。: p7 _6 h& L1 p* w: z
& z7 r8 _/ A7 ^$ g- _ R+ Q1.2逻辑变量的逻辑运算
, M# z" @3 U, ^ d* L
) ?! r7 n+ y+ \& b0 N U1 G逻辑变量的取值只有0或者1,他们之间可以进行逻辑运算,运算符有:&&与;||或;~非。这里需要注意:) X4 K6 y4 B. N# M8 ?& k8 G
1)~单独使用表示非运算,要区别于不等于~=的连用
/ M( J' I. q: ]. L4 S8 y2)如果是高级函数的判断配合非运算,也可以实现判断,例如
( W }1 ^8 u0 I( Q) i0 B& r0 l
( Z8 X8 k5 p) D. \- a=~isprime(x)5 a) H3 g9 D- D
- t, R5 S/ d2 g6 Q1 s- ^& h
- @8 N$ s8 x5 x! l* p4 D就相当于判断x是否为合数
/ I! d; x* s' C* {
) r! a! j2 {# ~1 Y8 n: Z' E3 x1.3逻辑变量的数值运算% I/ O/ Q5 B% ^! q0 I' G- T3 D* z9 }
% T8 j6 N2 P0 M matlab中逻辑变量可以参与数值运算,参与时,会被数值0和1代替。例如
# C$ s6 y- v8 F& C' G: M7 Q1 s1 A% k0 h7 Q: G
a=1>2, y' L! D; U% H" [
: N' m! z+ M! c! b) ~$ o" K5 G
生成一个逻辑变量a,则
2 j5 X+ i* l4 a/ I
7 q3 q+ ^! `4 h- _# @$ ~% Q) ab=a+1
" E4 ^( I0 q* x7 o5 _/ F
6 x: }6 n- x# `, d5 G时,matlab会判断正在进行数值运算,然后将逻辑变量a转化成数值变量,由于a在逻辑变量时表示false,所以转化时,a相当于数值变量0,因此会得到数值变量b=0+1=1。8 b. C2 n. S& @
/ f# C3 h9 F: S9 M. m+ ?
2.流程控制1 q, q2 Q+ H- z
) h y+ T E4 q8 ?) ]) E; @
matlab的流程控制和C语言类似,if和switch作为判断依据,相当于流程图的菱形框,for和while作为循环,相当于流程图的反向箭头。( R" b+ x- @- `8 b/ ?
# m9 [1 d( N, a1 S
2.1if判断 ~1 ]/ e9 Q9 R$ {, J' z( v
, d! n0 h( K1 z3 o+ k
语法是:0 h7 d1 l& W. q) a0 L
; x; S# j3 k) n5 B
1.if 逻辑变量1* m. r! H L7 L4 e
1.执行语句1
( T- V3 w7 _! N0 S 1.elseif 逻辑变量2" F% a: y3 L# ~! D( t2 k6 d( z7 y
1.执行语句2; E6 l" h( K. ~, T. `
1.else
4 R1 V% G6 x! A 1.执行语句3
* A1 f0 q2 p# M/ B6 O 1.end! R( B2 [2 K; C/ M/ T4 n
+ o* J" Y# H( X( K4 {" F其含义与C语言中一致,是顺序判断,即逐个if或者elseif进行判断,若逻辑变量为1,则执行语句,若为0则进行下一个判断。其中逻辑变量经常用多个逻辑变量的逻辑运算结果来代替,例如我们经常看到的是
; |2 ^$ _! Q& |" g) g1 e
; Z, q6 _7 A- |3 f% V/ e- if x>1 && y>1
- t7 h$ U) K( n
7 y7 D# p2 P" o" l0 ]5 v! p# S
. O. r G: l) V6 A而不是先赋值再判断的2 [# m& n; ~8 C& l5 Q
' z- T/ {3 I3 O5 ?" E) K9 |- a=(x>1) && (y>1) { a. x. y7 a) {
1.if a8 |9 \% g0 k1 p4 A& M
. I0 j# i8 u, ~
2 ? A/ Z8 ]! x' Y* B5 x) r! b. R
7 j. X1 d9 O, U( M' J5 Z2 s% d' J! p其实这两种方法是等效的。有时候为了书写和注释,也会先定义一个逻辑变量flag,然后再if flag。" |% W/ \4 Y/ x" W9 s; s/ W9 T
! U: P5 B6 v" _2 r9 N# `9 c% Q
2.2switch判断- E" R4 s2 B3 e
Z; {9 G9 r Q switch的语法是:
; f5 h7 P, N/ s# P1 d 1.switch 数值变量1 U; q) N- u6 Z# L/ @5 W
1.case 数值1; U5 G L& z4 m0 B, Q+ ?/ B
1. 执行语句1
# A- b) }' h) _$ l8 w 1.case 数值2
2 ]& @1 D( a8 U8 H 1. 执行语句2" e) Y+ c$ E9 U3 h, A
1.otherwise4 }, G* Q' R2 x
1. 执行语句3" ~$ i( v# S2 e* N2 [3 N ?
1.end3 q, w% J9 X8 U. H: u
5 L! q {6 d" |
switch与if最大的不同是,switch只进行一次判断,即根据数值变量1的值来决定执行哪一个case,而不像if会判断多个elseif。需要强调的是,只有当数值变量1==数值1时,才会执行语句1,而之前说过,==这个判断是有舍入误差的,因此switch一般用于数值变量1只取整数时,比如sfun的判断。对初学者而言,也可以先无视switch。
5 k1 `, q+ g7 J- _9 e8 x r: s1 X K% |( W# _
2.3for循环, W1 T& Q: ~6 M7 b+ p8 [) g7 ~
+ {) q |* A. I; w for循环的语法是:
1 E5 m" ^% ^; v" @6 f. D" z+ m 1.for 数值变量=向量2 ?0 S! y; ^ {$ _9 `
1. 执行语句
2 `; s5 ?5 P5 G V9 P5 b* B/ t 1.end
1 J# W* `" b# |: E2 ~
9 E" B. `( O* j% H其含义是,数值变量会取向量中的每一个值,然后执行语句,在执行语句中,数值变量是一个1*1的矩阵。matlab中程序换行有两种方法,第一种方法,只能从第一行换到第二行,具体操作如下,首先在第一行中写完命令之后按下空格键,然后再按下数字键盘上的小数点键,小数点数目为3,之后按下enter键就可以实现换行。 ...+Enter;第二种方法,直接按住Shift+Enter键可以直接实现换行0 g# t9 X3 K2 r1 Y* v1 D
3 v `/ Z. l6 M
for a=[0 1 3]7 t7 _" v+ b( ]3 Y: ~* G, U. @: j1 S
& ^& h' ^ {6 l! f, D
则会让a=0,执行语句,然后a=1,执行语句,最后a=3,执行语句。这里容易和赋值语句混淆,因为a=[0 1 3]是一个数值变量赋值,赋值后a是个向量,但加上了for后,a是1*1矩阵。另外,在数值变量赋值那段,我们说过有一种常用的赋值方法是"a=初始值:步长:终值",其结果是把a赋值成一个向量,因此这也广泛用于for语句中, O6 W/ l( x" A. c7 ^8 F3 t1 n/ u
& ^% M, Q# G: A0 r
6 q0 O5 y! R5 I C3 t8 W. G
z' v: ?- C ?- for a=初始值:步长:终值/ T" w" D j6 @) b. E, h6 A* j) R
) ~9 t# a# o1 c) c* J" }
9 [+ `9 z0 f2 g+ ?0 P
则在执行语句中,a是一个遍历初值到终值的1*1矩阵。
( q$ K. B0 K7 F$ e1 r7 ^$ A1 S; O: d
2.4while循环
# I5 Q9 S l# x/ H% c" x7 w2 B1 m$ {. h8 b p/ P& z7 e+ [
while语句的语法是:5 K U. E4 J3 h8 a/ c0 G
1.while 逻辑变量' Q7 C" b/ Z: f+ n6 t( V- _ n
1. 执行语句' B ]5 N* ^: U( {: _
1.end
5 d# C0 s2 F% I* W* ?. `
& [2 Q$ H% D8 }$ M3 v8 M9 ^3 n/ r
2 v5 L3 a8 y7 p& ~; P. _( S; G4 s0 f2 Z
其含义是,当逻辑变量为1时,执行语句,直到逻辑变量为0,因此while的执行语句中,一定有改变逻辑变量的部分,否则就是死循环。比如写了while a<10,就一定会在执行语句中有类似a=a+1这样的赋值语句,使得若干次循环后,逻辑变量为0。总体而言,while并不如for稳定,所以初学者也可以无视while。
2 t3 o( F2 j: Y$ p1 P6 ~0 v: x
& Y) |, \7 R% l- E7 N% ^9 o1 C- M) Q" {- K7 ~$ `
: o8 U5 y' H/ W9 O9 V; q" F5 ~9 k1 E& z. {
* n& @+ h4 w1 j/ `$ M, R$ B
6 n/ z+ r& P+ v8 N1 ]# t1 M' ~( O9 M. a( Z# z: s6 I
! G1 P1 c2 r7 h3 c1 Y
# N6 g! s; u' ]& J- d$ l4 O |
|