|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
& Y+ i& F o2 W* f! X$ pmatlab解决问题的最基本思路是建立脚本文件,那么脚本文件的第一段就是定义一些变量,这和C语言等编程思想是一样的。matlab提供的变量类型很多,最基础的是三种:数值变量、符号变量、字符串,其他的类型还有cell、table等。这里仅说明最基础的变量类型。% N C3 d0 K$ v- V! f! U) C
' C ^; I, P3 u$ u, F3 u) M X1.数值变量
1 B) Z4 A/ b3 I" C; \" ?* P matlab中所有的数值变量都是矩阵,赋值时,以方括号作为开头和结尾,以英文逗号或空格分割同行元素,以英文分号分割各列。例如在Command Window里输入
$ Z! |* ^& D1 T
2 J1 Y3 _1 |9 x" V5 {5 k: H; l- Ja=[1 2;3 4]
$ \/ \ @" e6 p/ K/ f J6 @+ r9 b4 i3 ~) A1 G0 d3 f8 K
1 @& h8 n5 D& [8 z# B
4 y. t) C8 @9 t f; m
7 b( r, Z4 A3 K' ^" c/ _/ R) [可以看到运算结果,a是一个数值变量。同时workspace里出现一个田字形的变量a,说明变量a的类型是数值型。* l1 S2 ?$ m! {' N" O
6 ]) m5 s( j4 j Y
, |7 A, \- D9 L4 U5 u A {2 R: l# Z
向量和数字可以视为特殊的矩阵,例如* H+ s- w; W7 Y, F* S
% d9 \" r9 V) p5 Z) J. T. Q
a=[1 2] , l. ^8 z$ U k
. J+ w4 F0 [' V
a=[1;2]
, c/ D4 Y6 f- v/ M+ {7 o* \; E! U
7 x8 f* h2 w) Y9 K$ _% u分别是行向量和列向量。8 V# C# |. r K
6 D& z5 i a4 Q& B7 x
a=[1] 可以简写为a=1 是数字。
1 V8 x# ?# P2 M3 E5 O& X9 H
( ^$ w: v' Y2 o4 y3 C 数值变量的命名要求是英文字母开头,不能包含特殊符号,大小写敏感。这里推荐采用下划线来进行分割,例如value_of_A,这和其他编程语言的命名规则大体相当。9 L `9 n+ |; I) K2 o6 o$ s* f) G
. M; O. K% E' L" x I. r; U. k 赋值中,有时需要用到等差数列,例如定义一个向量a=[1 2 3],如果比较长,赋值很麻烦,所以matlab提供了一个简单的方法6 ]- n' O# C) v) p: ?, i
# T' A- i5 S5 k" q0 va=[1:1:3]
: x$ {: y- D5 K8 f
# X7 Z/ r* k3 D( V0 h! E- Q6 r: Q这里两个冒号的意思是起始值:步长:终值。采用这种赋值方式时可以获得一个等差数列行向量,并可以省略两侧的方括号。当步长为1时,可以省略步长和一个冒号,于是可以简写为; ~* i ^/ _: i' |# C9 V
, b; B) R+ `9 I! M+ o( d
- a=1:3
# }' M9 o% ]: p8 T6 N" I
, r" v* |: c8 a/ u R% U# }
* G- _+ a; [% i* b4 J6 g$ W% }7 t5 j
/ I9 Y' q5 `: C3 y2 L' Y; u6 g, `( p2 B0 v
另一种灵活的赋值方法是分块矩阵,其方法是变量名后面加圆括号,圆括号中加序号。例如6 l4 L$ z4 ?+ B" s6 [6 g: v9 U: i
: X$ e' r% T& f1 c9 N6 Va=[1 2;3 4]3 R: Z; z X( q
1 c( B) }2 j J" J& j5 ^! l# H5 A定义变量a之后,
( U, i4 L$ L2 b* `: s- ] a/ [0 ]5 S1 M5 Q+ s
b=a(1,2)) u- `/ P6 h) B. P5 G0 h
5 R. X$ Q2 c7 m( }就可以把a的第一行第二列元素赋值给b,当然也可以用1 n$ ^3 ]" L2 d! `$ ~' I8 W$ @
E/ s/ g g W9 x: D9 f5 na(1,2)=10 u/ R& W! \$ c0 e
( e5 @8 ^: P: n9 f
来修改矩阵中部分元素的值。这里需要注意,序号必须是自然数,且不能是零。当矩阵中有多个元素需要赋值时,可以将序号部分改成向量,例如" f3 X. \! x+ M3 n8 H0 x
& M' i, I4 H* s# C( F" }- c7 N5 ea([1 2],[1 2])=[1 2;3 4]
: c, e) Q1 f& m
/ f9 c' I, [- f( t8 P! h中把行数和列数都用向量表示,就是说对矩阵a的第1和2行,第1和2列,总共4个元素赋值。更进一步,也可以有a([1 2],1)表示a的第一列,也可以写成
4 M+ _% t+ G8 ~1 {- ma(1:end,1)
/ G4 Q7 M1 k4 x' k) o! `" Z
4 [' z+ J" a; y6 [. V- S6 u这里的end表示终点,即a的行数2,也可以更进一步简写成2 Q0 u& K+ ~' @% S ~4 n
+ k$ M) ~* W. W6 |& r8 pa(:,1)
) H M/ Q/ I2 @. R5 K, _# G1 g; N, J
" I& m3 H$ Q, W3 }$ l2 t: ]& p8 H" ?这里的冒号表示从头至尾。这类赋值方法最为常用,但基本的语法非常简单,方括号表示矩阵开头和结尾,圆括号表示从矩阵中选取部分,把握这个原则,有利于读懂程序。7 U9 k' a+ D) L2 |. A7 R9 u
+ x5 o4 a, P1 ~ H* I% r) A 当然分块矩阵也可以: Q+ }+ e& y& w$ r8 l7 `* Q' m
9 O, ]0 C0 Y$ Q% F: ?7 Cb=[a a]( J+ e2 p- f- e- Q: R6 `1 Y
c! Q+ S9 |: }- [ s这样的赋值方法,但需要注意的是,方括号中的元素必须满足矩阵的行列数要求,例如
: l, ]) D' M `6 \3 H l( R5 C7 g T$ C. q6 ~( [# N. U7 X
a=[1 1]" C0 P& g5 Q8 p3 E9 c" ~& L
& a( [ _; T* `% A2 X; Z# p
b=[1;1]
1 V; y) H: Z/ w
7 k7 Z% q; C/ E6 s6 vc=[a b]
; _: G' _' T7 H2 P! R# U* w/ K
; h8 U/ b: G7 u5 {. I& x9 m就会引起错误,因为此时matlab无法确定c的行列数。
5 V+ L7 M# Q8 v$ H8 Y1 [) N7 o/ J# E; n* O
3 V! q; y3 G/ d2.符号变量$ ^; u9 S0 ], q! h' b
+ x0 F2 ~; B( d; N A4 w- z# p9 [
总体而言,符号变量比数值变量简单得多,因为变化非常少,常用的赋值命令是: L: A+ K l2 H
- N. S' P$ b1 Z" e8 N% ?2 u" l. ^
syms a b& @9 r v" }- i& ]0 v! p
' x' o- g5 y* E- B$ p) Isyms表示这里要定义一些符号变量,a和b是变量名,符号变量的命名规则和数值变量一样。有时候也采用- L% r( M+ m, k3 H- i/ q0 K
8 A( y9 }( k( z* D1 P7 Rsyms a real8 G4 p; K( r2 M9 ^
" }* n' v7 P7 Z: w& O5 ` k来强调a是实数变量,具体可以doc syms来获得帮助。
* S( ]2 c6 @4 O2 ] [5 J" E$ |4 Z# Z/ `" N6 |9 ?9 Q9 s, V
有些变量之间存在依赖关系,此时可以定义
& m0 ]) j2 G* E4 ], F% Z* w0 o# j/ K$ l" r! Z! v1 D
syms x y(x)9 M! V, d, J- o, s2 `, i! W
( v2 z9 i, z2 g: v/ f
这里声明x是一个符号变量,又声明y是一个符号变量,且y的值由x决定,这相当于数学中函数的概念。当然具体的函数关系并没有明确规定。也可以
7 E; j- m, c- P$ O+ A2 P
9 D$ Y+ P' L% K; l! J& L+ Rsyms x y z(x,y)& G1 I& Z9 _$ |0 Q
6 R6 C) _: x% d- D
来定义符号变量z,z依赖x和y。这相当于二元函数的概念。这里的圆括号显然和数值变量中的圆括号含义完全不同,这也是学习matlab最不习惯的地方,同一个符号,由于变量类型不同会有完全不同的含义。所以在学习matlab的过程中,一定要区分数值变量和符号变量。
5 J! G- ?6 \2 x2 v5 z; L9 a6 V* |$ n. x8 K$ I
3 l. m' H8 W% N0 O0 v/ \
上述方法定义的符号变量是一个数,或者1*1矩阵,matlab中也可以定义符号矩阵,例如
( g, J8 I& ]4 ]/ V! }
% ]* E" B* R/ hsyms a11 a12 a21 a22
9 u8 }+ Q0 y X$ o9 A6 a, r3 D' ]7 i/ c/ _5 ], F8 M6 J
A=[a11 a12;a21 a22]
! l" ~8 G F1 ?8 X! K2 {
( ]. g) L" D/ J" t- M就可以获得一个矩阵符号变量A。* w/ o) i1 q0 }: z1 y% L
5 a, P f8 c4 O4 ~4 X* c6 | 定义符号变量后,workspace中出现相应的变量名,图形不是数值变量的田字形,而是方框里有个立方体,双击后可以看到行列数。& n% D. Z0 N* y8 A% p! }
% [; k/ m' F' A# L
& G+ S1 p) O" H
; a) o' ?, I4 f h: p2 g
3.字符串
; U; D7 N( R* v2 b
5 `- q& Z- ?' o& e% e5 Z: T" `6 S7 o 比数值、符号更为简单的就是字符串了,其定义方法是以单引号开头和结尾,例如- X5 B {% N! V
6 p" u& [( v4 o: W8 c, Ca='hello world'
K( `) G+ ~+ [+ q! } S1 n9 T- r' B( f
就定义了一个字符串a,其值为你好世界。matlab中较为特殊的是,字符串可视为行向量,例如4 ^$ G, U8 @( E A4 u
; I! `( [0 b/ K
- b='hello '
- c='world'
- a=[b c] t b7 l+ o" Z4 l% u
' m C) P$ P' @7 s J) M0 I5 Q2 b9 u; r+ P A: P% y1 A) m
也可以获得字符串a,其值为你好世界。另外,有时也可以将字符串视为矩阵,例如
- Z9 K' D: n% }7 r# ]
0 ?" g, n. F: S7 q6 K5 ?a=['ab';'cd']3 H6 [: A( v" ~& h/ F' _; k" i. s6 _
9 i0 }8 P) ?+ U9 E8 l' G( f2 h1 R但这种用法很罕见,同时要求各行字符串长度一样,否则将违反矩阵行列数规定。
) @' N! N7 z" ~% H# p1 d3 n1 C7 u- p m
当然字符串的值也可以是特殊符号,比如
% b v2 q, F7 n4 G. a4 G2 {9 G, V
% L0 `6 `4 h. E! B- ',6 N7 \; n+ `0 N4 O" X, w1 d0 o& e: X
! b1 h! F& n1 J1 w! O9 f就定义了逗号,而最特殊的就是定义单引号,因为单引号会和字符串定义中的单引号混淆,因此matlab中用两个单引号表示一个单引号,也就是
6 S9 D) |- V! z/ u
" x+ A9 f0 g% b& Z& W- a=''''
$ {4 [- T8 a! N9 V , Z6 l' M6 }) l ^! I8 u: f. v
表示a是一个字符变量,值是一个单引号。语句中第一和第四个单引号是字符串类型的开头和结尾,中间两个单引号用来表示一个单引号。
( z+ P! f, l x J& z
3 @7 {+ ` L- H 定义字符串变量后,workspace中出现相应的变量名,图像是方框里写了ch,双击后可以看到行列数。
& t! I9 [: f0 b
) P/ h8 Z7 M2 T: ~+ i, Q; \
# c" z4 L3 Q) m, p
4 {3 g' W2 w ]) ]2 b4 G$ x" ]7 r( V& I7 v2 m0 b
3 }2 u, U( P7 z) O9 X) E9 W
5 \* m1 ~/ L: g9 i
* O+ D! J! \ t$ i$ }# z# D: @* E: {% y9 p9 ?6 T7 E2 p v5 b0 G
|
|