|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
) f" A, v/ @9 K! y* y' Nmatlab解决问题的最基本思路是建立脚本文件,那么脚本文件的第一段就是定义一些变量,这和C语言等编程思想是一样的。matlab提供的变量类型很多,最基础的是三种:数值变量、符号变量、字符串,其他的类型还有cell、table等。这里仅说明最基础的变量类型。
& w; _0 D1 o, Y9 W: I3 C. {( r# d
% ]7 r( z) g% A1 F% D$ _2 M1.数值变量, _9 @) a& {% T1 n% ^
matlab中所有的数值变量都是矩阵,赋值时,以方括号作为开头和结尾,以英文逗号或空格分割同行元素,以英文分号分割各列。例如在Command Window里输入: b4 ^% x: ^, k0 T0 u* G p& _
' z4 y" _- ^2 m7 w, Ha=[1 2;3 4]
) I5 W) t7 n$ W4 z1 l
' Y3 y9 I% P1 I( n6 w# p" g3 C* \* {/ y( ?& j, ~& T- N+ E9 j- h5 ^
, _/ e! U. f0 ~% K1 _$ \4 r$ s# d; Y+ M/ N9 ^/ N( ?
可以看到运算结果,a是一个数值变量。同时workspace里出现一个田字形的变量a,说明变量a的类型是数值型。6 q) W9 ]+ R4 Y. w" L5 f4 f; {
* `4 ~, v7 Z' V8 y! d" ^6 t
/ P+ I& \% ?1 s3 \0 A& p0 n9 w& `: P+ C _
向量和数字可以视为特殊的矩阵,例如5 ~& c7 h, [% y1 v2 F! D
) u( s; r5 `" W V8 l% X+ Y6 _- Xa=[1 2] * O: K5 n1 t- T8 N1 j2 D; c
' O5 J5 E! M' c, L$ V X/ k/ Q" o2 }
a=[1;2]
3 ~/ o* @9 T( \8 Z" b( g% ^0 |
, h+ m% o9 t% r2 X4 e分别是行向量和列向量。
F* L8 |0 B% s [ t' l; P- A# Q9 e6 H; V
a=[1] 可以简写为a=1 是数字。) K: V4 g( ^, ^5 _7 P8 ]. }
3 f" e! S( \; T W( G# k
数值变量的命名要求是英文字母开头,不能包含特殊符号,大小写敏感。这里推荐采用下划线来进行分割,例如value_of_A,这和其他编程语言的命名规则大体相当。
- k. f8 q8 Q" m* t4 r! f$ [ Q g6 g4 B' A- g. r8 Z7 z. ^- Z8 A" O* J
赋值中,有时需要用到等差数列,例如定义一个向量a=[1 2 3],如果比较长,赋值很麻烦,所以matlab提供了一个简单的方法& N2 V5 k$ k( ~# A
/ c, i3 f) U, T; h' Q
a=[1:1:3]+ [, y5 R% R, E6 a8 m1 V
+ @! X. V8 m3 [. x% ]
这里两个冒号的意思是起始值:步长:终值。采用这种赋值方式时可以获得一个等差数列行向量,并可以省略两侧的方括号。当步长为1时,可以省略步长和一个冒号,于是可以简写为& D. Y% e: d7 S1 t4 A1 ~7 W( z8 W
5 H( P0 f6 J/ r! W
- a=1:3
$ ?9 Z9 u {+ ?' ^: z9 h S
0 B& M0 g0 t# B$ y3 e1 z$ c" b1 t; T; S+ ]% F, p4 x
7 N" c" E9 w2 T7 n5 l
) Z& D$ D. x `
另一种灵活的赋值方法是分块矩阵,其方法是变量名后面加圆括号,圆括号中加序号。例如
, T0 R1 y2 ~) o! R- h& ^ W; G' G8 S' T7 w/ H
a=[1 2;3 4]* T5 P8 G9 _2 I' N) ~
# {; o/ s0 B7 ? _8 w9 Y7 a定义变量a之后,1 e# |, ~7 Z( w; V/ }
/ y9 Z& B- b" g9 ~2 k$ @b=a(1,2)
( a7 W; C: f0 b; @1 }% O1 J) \9 C% M$ k2 }# t
就可以把a的第一行第二列元素赋值给b,当然也可以用
9 `( y. p% K8 j$ ]3 i4 k% I( i T3 l+ o& ]0 i
a(1,2)=1
( S" Y \, d5 ?. v) k
1 t) n- |& o% c/ q- f来修改矩阵中部分元素的值。这里需要注意,序号必须是自然数,且不能是零。当矩阵中有多个元素需要赋值时,可以将序号部分改成向量,例如
3 w7 S6 [$ z# l4 i
0 w" ]' \9 v5 x/ s: i: Aa([1 2],[1 2])=[1 2;3 4]
2 E' \' ^$ B# q" b4 p* k5 ]6 H% J9 W
中把行数和列数都用向量表示,就是说对矩阵a的第1和2行,第1和2列,总共4个元素赋值。更进一步,也可以有a([1 2],1)表示a的第一列,也可以写成: k0 L( ^. I. y e1 B7 K5 e
a(1:end,1)! Q( {; g$ k0 i0 j9 Y* y+ U% `3 u
- [, Z9 b5 Z/ s. d; B* C X8 D# g这里的end表示终点,即a的行数2,也可以更进一步简写成
) t+ F0 O( p7 K* i( W, F, G& T1 _+ M' s5 P b
a(:,1)% k3 b5 k# c( Q" y( h
1 ~( P( w( Y3 S" l$ J
这里的冒号表示从头至尾。这类赋值方法最为常用,但基本的语法非常简单,方括号表示矩阵开头和结尾,圆括号表示从矩阵中选取部分,把握这个原则,有利于读懂程序。) [3 V# F) j: w' q0 r7 {
% _3 q p1 E4 n8 N! {7 e
当然分块矩阵也可以
# P0 _0 z1 N. o$ ^# n4 A
* Y7 _- Z' N0 u( xb=[a a]
6 i( s- |! r- S! r
+ s& e+ ?% B V& R+ Q这样的赋值方法,但需要注意的是,方括号中的元素必须满足矩阵的行列数要求,例如
1 n# T% V+ x0 ~/ p) Q& }, k) Q0 j" O) b+ Q j
a=[1 1]
3 {$ \7 v! d. x1 @6 C. b7 p& h
1 m. U& v8 s# t4 Pb=[1;1]
3 y1 f( o ?5 y
( a; e2 m0 B4 ]c=[a b]/ R/ }7 d2 Y/ L2 E8 w q
4 `7 V) ^3 P0 p就会引起错误,因为此时matlab无法确定c的行列数。
1 J% I/ U. q4 z9 d2 I: f
4 r/ |6 T5 L4 ?4 S, L2.符号变量
& p& } Z# i$ W0 L' W; h4 U9 K# \1 F
总体而言,符号变量比数值变量简单得多,因为变化非常少,常用的赋值命令是0 K; K' C# S6 x
7 B0 j( b) l# t" S0 z3 {' ysyms a b
: H) c7 N% o+ D
* o. K* F8 I. H( C% `9 n0 csyms表示这里要定义一些符号变量,a和b是变量名,符号变量的命名规则和数值变量一样。有时候也采用
1 A/ q9 f: g5 E7 U6 j9 Q
: S2 b( O* o# J( asyms a real
6 n, C* w8 \" ]- u: [- X& W- `$ `) r+ r$ `# c4 w! [' V
来强调a是实数变量,具体可以doc syms来获得帮助。8 L% }. I$ Y0 W% c
, c6 p/ @' L$ D; _$ @; h 有些变量之间存在依赖关系,此时可以定义# X. t- I) `' Y+ x
+ F* W# ^; V5 y3 M1 U
syms x y(x)6 w8 ]( b6 Y9 ?7 K
1 j2 ^- V& u: {) b这里声明x是一个符号变量,又声明y是一个符号变量,且y的值由x决定,这相当于数学中函数的概念。当然具体的函数关系并没有明确规定。也可以
7 t0 K n" R5 w9 \! r, }( ~+ t7 R2 Y" z7 y W
syms x y z(x,y)3 @ J4 i, K- f( \
8 N6 E0 h4 C$ z& A
来定义符号变量z,z依赖x和y。这相当于二元函数的概念。这里的圆括号显然和数值变量中的圆括号含义完全不同,这也是学习matlab最不习惯的地方,同一个符号,由于变量类型不同会有完全不同的含义。所以在学习matlab的过程中,一定要区分数值变量和符号变量。
: W& ]. V7 H! E( B
$ b4 T9 v( ]5 u Q( L3 @6 `0 O3 F$ Q& p0 D8 h
上述方法定义的符号变量是一个数,或者1*1矩阵,matlab中也可以定义符号矩阵,例如6 b; ]* o; U( m# O* S. q# _
' \$ ~9 x) M7 d# v, j8 H" ^- u0 rsyms a11 a12 a21 a22& u( g% h! E3 _4 s1 ^
2 G, P8 |! T2 R; X6 u
A=[a11 a12;a21 a22]
4 R; U4 {2 |8 x
0 N/ |9 M1 K: |: C7 t Q3 Q% X2 K7 u就可以获得一个矩阵符号变量A。
1 I8 F Q- K, ?5 G* x' m; O( D' g
定义符号变量后,workspace中出现相应的变量名,图形不是数值变量的田字形,而是方框里有个立方体,双击后可以看到行列数。3 ^" b7 N: g% G" n5 v2 W* |
8 |7 P" x, p$ F& I( R; ]4 L4 r
& G+ P4 g+ b+ ?7 `$ N0 T
7 A. N( ]" E1 {( L
3.字符串1 Z( ~- Z; ]7 S* c$ \/ E+ p
0 m) w0 ?/ Z2 k! I0 V, S 比数值、符号更为简单的就是字符串了,其定义方法是以单引号开头和结尾,例如
; Z, c9 @: R5 a5 Q( [
3 x. x( l/ p3 {/ v+ b3 C* K5 |" J; na='hello world'& S" n+ Y" x# r2 q$ a6 U. L% n
6 J5 Z$ B. ^% n% r" i就定义了一个字符串a,其值为你好世界。matlab中较为特殊的是,字符串可视为行向量,例如6 {$ c) y" @9 O. y5 D H- C$ c
: @; q4 O* ^" G* |+ r1 l3 |2 y
- b='hello '
- c='world'
- a=[b c]1 P, t+ K C3 L3 v1 X
% { n# U3 |2 \- y2 }, Z+ h, u9 C9 |) r
也可以获得字符串a,其值为你好世界。另外,有时也可以将字符串视为矩阵,例如, W2 m* x [9 B/ G5 V
6 J) _! k' S; I4 |* j8 U- \! fa=['ab';'cd']7 ?: _) p+ d: s7 x3 F
2 T# I5 A* T, A+ V$ l p但这种用法很罕见,同时要求各行字符串长度一样,否则将违反矩阵行列数规定。
5 K7 @6 H, [$ f- ]; a, i
+ T1 k0 m! _# C6 z 当然字符串的值也可以是特殊符号,比如
2 O) ^! c8 f X6 C8 Y9 Z6 D% s: O) ^* v$ y3 I
- ',
: R4 S$ h' f6 j4 P) i* [% m5 i5 G5 E" o
2 @ ?" T& x" T; `' `, T% I就定义了逗号,而最特殊的就是定义单引号,因为单引号会和字符串定义中的单引号混淆,因此matlab中用两个单引号表示一个单引号,也就是( B% d' E R! w3 S4 V2 b9 I
- L7 [+ O N5 ]% @% Z# o t
- a=''''
' ]8 g' e9 R k0 a' d* K, G, C1 z F7 s5 Y- o8 y' g. t3 y, L1 c
表示a是一个字符变量,值是一个单引号。语句中第一和第四个单引号是字符串类型的开头和结尾,中间两个单引号用来表示一个单引号。1 } S. m9 y$ e) m: j' h8 T; {
* t2 @+ J! g# Z" J' Q
定义字符串变量后,workspace中出现相应的变量名,图像是方框里写了ch,双击后可以看到行列数。1 e5 G$ W$ o. R \
/ C- ?4 v D! g- `) C1 f* i: j7 s+ Z
; W+ s- Z5 a+ I4 X2 O9 D* Y
a/ E6 t' L7 i1 V, X( B, [
5 S& L2 ?1 m6 j5 g$ X8 f0 W+ p- d: V8 H
* ]: p" M4 _, Y8 D9 q: N
, p/ T* X. J2 c; m* | K" {
5 Z) d5 Z2 r: } Z1 S; m2 z; P |
|