|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
6 V" L" e: P8 X. ^
matlab解决问题的最基本思路是建立脚本文件,那么脚本文件的第一段就是定义一些变量,这和C语言等编程思想是一样的。matlab提供的变量类型很多,最基础的是三种:数值变量、符号变量、字符串,其他的类型还有cell、table等。这里仅说明最基础的变量类型。
& g3 g+ d2 K( a& q# a9 R& l
# c& i! R" Z4 R- K8 Y1.数值变量+ _/ G/ f) ?, t2 P6 v* n: |6 l @
matlab中所有的数值变量都是矩阵,赋值时,以方括号作为开头和结尾,以英文逗号或空格分割同行元素,以英文分号分割各列。例如在Command Window里输入+ K6 K1 w- L1 ^( k$ q+ b
- s: p8 s' ]( X- Z9 m( Z' e' L# z
a=[1 2;3 4]& c- Q) I0 u# @% d9 ?% E# C; q' d8 u
C/ Y- ^) O! A2 N9 o. y! }3 ~& j! c' y( P2 x/ `) k U
: p% a* t) G" ~0 w# o/ f3 d! Z1 n* w7 L; ?# {4 C- s! R
可以看到运算结果,a是一个数值变量。同时workspace里出现一个田字形的变量a,说明变量a的类型是数值型。
4 J0 l$ c: q$ W
6 O$ C6 {( R* c1 L' }
& w1 g$ O' v( ]; t/ E7 c# n4 b2 T0 K- i& l: `
向量和数字可以视为特殊的矩阵,例如
6 k5 P4 Q" d) U4 b% @7 W
$ n1 b4 D: \) v# G) Qa=[1 2] ) B1 \: B+ k$ U! S" W3 m. L
! T2 V+ W3 a9 j1 T1 [0 ^a=[1;2]
8 d% _$ v% n0 I4 a0 d
! w# {3 A$ B5 B; c) _/ J! _$ Z分别是行向量和列向量。
" j2 R# I8 \& U
! b6 z. z: \' M5 ^' i) \! la=[1] 可以简写为a=1 是数字。1 \2 I' g2 w- Z Z0 L9 i
( C5 ^4 w9 z" n& u& l
数值变量的命名要求是英文字母开头,不能包含特殊符号,大小写敏感。这里推荐采用下划线来进行分割,例如value_of_A,这和其他编程语言的命名规则大体相当。
0 a4 [" h# b0 o" |. a8 T# Y0 p% w" l7 R& W9 A( ^! \
赋值中,有时需要用到等差数列,例如定义一个向量a=[1 2 3],如果比较长,赋值很麻烦,所以matlab提供了一个简单的方法
0 r }, c: D- c) \3 W8 D; O3 J( i ~0 Q; \5 g
a=[1:1:3]
' u2 ~* d) I+ B9 Z# W" o5 k$ A
7 M8 i/ b) x; T: M这里两个冒号的意思是起始值:步长:终值。采用这种赋值方式时可以获得一个等差数列行向量,并可以省略两侧的方括号。当步长为1时,可以省略步长和一个冒号,于是可以简写为
K4 r. P0 {, W9 f& Y: s7 Q) A, k( S* l# {
- a=1:3' K& _- D& a+ @9 n! |3 t
& b6 [ ^# M/ s$ J' {5 O \' y
: ~) k5 a& @( b# c" o
0 Z9 T; r- n! P2 _& _, }% t. [. n$ }+ Y) u" K3 P
另一种灵活的赋值方法是分块矩阵,其方法是变量名后面加圆括号,圆括号中加序号。例如
, W- q8 W% H9 x' L" q9 f" D6 J# ~( @0 ?+ u
a=[1 2;3 4]
$ ~7 R" A2 u1 x9 j/ z/ }/ Q4 B4 G5 P1 P* T. {
定义变量a之后,' R9 x' _1 a" B: w" s4 m$ T
* F( h$ g; `' `4 ^- u" cb=a(1,2)
) C/ Q( f7 Y5 W, L. v5 o6 q- x
6 t% b: {+ m1 o9 Q8 S) [. f就可以把a的第一行第二列元素赋值给b,当然也可以用2 ]+ f# V* F+ _1 J$ s4 j3 s
0 @9 y5 h" i7 A! K, ~0 z
a(1,2)=1! R6 ^" L2 g" ~" [
$ Y# f7 [: Z2 }* ^2 [来修改矩阵中部分元素的值。这里需要注意,序号必须是自然数,且不能是零。当矩阵中有多个元素需要赋值时,可以将序号部分改成向量,例如9 n* q2 _6 N1 Z+ G3 H
: w' |4 b* U. u) g7 y
a([1 2],[1 2])=[1 2;3 4]' b# Y0 R& m% t. C8 D3 P$ R
% m4 ^8 |' z6 f+ \( `' G
中把行数和列数都用向量表示,就是说对矩阵a的第1和2行,第1和2列,总共4个元素赋值。更进一步,也可以有a([1 2],1)表示a的第一列,也可以写成4 L' ] g |% m: r+ g
a(1:end,1)
m8 Y: i+ ^0 P# W- b2 a# T4 G: E" X
这里的end表示终点,即a的行数2,也可以更进一步简写成! \, d" j3 h$ i+ A
2 L0 k1 o3 K+ i1 ]$ V9 v9 {a(:,1): b4 L7 S4 B) K( G$ X7 t. z! m6 _
- m4 b [2 \$ P4 _ J' k% h7 z这里的冒号表示从头至尾。这类赋值方法最为常用,但基本的语法非常简单,方括号表示矩阵开头和结尾,圆括号表示从矩阵中选取部分,把握这个原则,有利于读懂程序。, F, u7 {. e* }9 D- h, ]1 w
2 T: t$ F; X2 [' x- _: T) H
当然分块矩阵也可以4 d3 c0 C* @9 u- P! u
: r. o9 s5 e% H( ]/ T! e
b=[a a]
! g1 B: P( |5 c3 E( P
, ^1 g6 P$ ]3 ^) ?4 ]这样的赋值方法,但需要注意的是,方括号中的元素必须满足矩阵的行列数要求,例如
" I/ o- E, V# \) f
2 S4 K0 [& J. S$ a' ?0 Ya=[1 1]
0 d% U* i; E% A; u) ]; c
9 x1 Q+ a* r7 ~/ X! L& h Hb=[1;1]3 J9 q4 J6 F( }* t) X8 a5 J
* u" S c% J4 P) e: {- bc=[a b]. G5 Y7 Y6 X0 W
5 o9 y7 n4 R6 ]) }" U就会引起错误,因为此时matlab无法确定c的行列数。
2 ]2 q. u) f }
7 ` N+ n3 k/ H2.符号变量- m8 ?1 J$ c6 D+ r ^: o
( q0 P, G5 x k$ X9 {8 J 总体而言,符号变量比数值变量简单得多,因为变化非常少,常用的赋值命令是
3 m2 [+ H1 L0 I0 c* m$ ?! ?* P: e3 s2 [' M' _/ Z
syms a b/ u; U- s7 k8 P: z6 ?8 g8 |
2 G+ j- k# d' k: |( F3 J' q/ d
syms表示这里要定义一些符号变量,a和b是变量名,符号变量的命名规则和数值变量一样。有时候也采用 p, ?6 F8 k6 \# r
: s) k; G* n" D! u+ Ksyms a real+ a8 z5 ^7 D1 d: O4 k6 D0 R
6 M8 l2 X0 k7 Z% n4 b0 z4 N
来强调a是实数变量,具体可以doc syms来获得帮助。5 w% r. {/ W5 W
# _6 R* p$ [6 H! p7 m x, J
有些变量之间存在依赖关系,此时可以定义
2 P8 \$ `, K) p' r; p5 \! v6 U: N/ X9 p# d$ O4 O
syms x y(x)/ J6 a4 s3 N6 N" I& c
' H9 {6 o6 }. U1 p这里声明x是一个符号变量,又声明y是一个符号变量,且y的值由x决定,这相当于数学中函数的概念。当然具体的函数关系并没有明确规定。也可以
! N9 `8 D( ~; x
& W. K1 V2 m- B6 p7 c* h& x% xsyms x y z(x,y)
& x! C& a$ ^) k+ x4 b3 t1 w3 L N& {' L8 [* I) M
来定义符号变量z,z依赖x和y。这相当于二元函数的概念。这里的圆括号显然和数值变量中的圆括号含义完全不同,这也是学习matlab最不习惯的地方,同一个符号,由于变量类型不同会有完全不同的含义。所以在学习matlab的过程中,一定要区分数值变量和符号变量。
' _8 S7 `2 ]1 L" i0 W4 s& h$ C
+ A$ y+ i* P0 T
$ b* }! D7 {6 y7 g; [3 S1 }3 N# R 上述方法定义的符号变量是一个数,或者1*1矩阵,matlab中也可以定义符号矩阵,例如
" m& [$ D' q( b$ j' c A* W+ P2 c' o& B+ N
syms a11 a12 a21 a22
% c% V* s! }( \& ]" {* z& O. V/ y% v1 J& {; ~
A=[a11 a12;a21 a22]
' q/ P6 a6 s8 d6 }3 ~/ U8 `; W- _1 d4 S! b0 i
就可以获得一个矩阵符号变量A。
* y# W1 m+ E; l8 k
' ]! L( `! `/ b: ^& d 定义符号变量后,workspace中出现相应的变量名,图形不是数值变量的田字形,而是方框里有个立方体,双击后可以看到行列数。% Y; J% Y* D* U3 {* M) ]
+ e: F" V- ^7 e5 G- n
9 l5 ~7 n$ p( W# F( N% n) A! r# Y% }2 d# P% e. O
3.字符串1 k, r* [# Q% W8 r- g/ H0 F6 q3 B
- `& ?; i+ z1 N' s5 f8 u0 i( ~
比数值、符号更为简单的就是字符串了,其定义方法是以单引号开头和结尾,例如; `) v; }) _' Q3 `
& s* A# X o( K6 y& Ma='hello world'* l1 X- J/ u3 K0 D9 u8 d
5 T* q) W0 O6 p& n就定义了一个字符串a,其值为你好世界。matlab中较为特殊的是,字符串可视为行向量,例如
1 ?7 R( n6 l& Q2 i, z& _; S( G* F+ h; d8 G) ^! ^. Q! M" Y; j `
- b='hello '
- c='world'
- a=[b c]
' c; Z r; E$ e( P$ v 0 b9 k6 X6 G/ F1 p; Y( a" l J
, ?9 d/ T5 g" Q% ]+ Q; m
也可以获得字符串a,其值为你好世界。另外,有时也可以将字符串视为矩阵,例如
: ^1 h, f; ^- E- C6 u; ]& d. U6 I# D1 O+ [! P5 T* g/ ~
a=['ab';'cd']( B- m: P4 {$ M: C8 B0 h( W
* j. M8 j2 m& i但这种用法很罕见,同时要求各行字符串长度一样,否则将违反矩阵行列数规定。
7 n0 u0 ~* D! I, a8 T! w2 b' y1 S2 c/ y' i9 Z
当然字符串的值也可以是特殊符号,比如
/ h1 o# A4 G% i. D# c; x2 v% e' s0 |& W6 Y) ], D
- ',
$ f8 c9 a) n I8 t7 ~" J
2 m* p7 o# c: R# T6 j" d. ^就定义了逗号,而最特殊的就是定义单引号,因为单引号会和字符串定义中的单引号混淆,因此matlab中用两个单引号表示一个单引号,也就是, J1 a* m$ b: ?! e; a/ Y$ m
; ?' }6 M- _) P) u; y- a=''''
) u1 @" }' R9 I7 h2 F
" b* e9 s8 h) o4 r& T& X表示a是一个字符变量,值是一个单引号。语句中第一和第四个单引号是字符串类型的开头和结尾,中间两个单引号用来表示一个单引号。
3 s1 a3 N) a! q+ V
4 l" r# t' F- s& I- Y o" k1 P 定义字符串变量后,workspace中出现相应的变量名,图像是方框里写了ch,双击后可以看到行列数。3 O% M7 V: k1 w. c: d6 J
) c$ \1 X! y0 W7 t
5 N0 N" l; c }! I
# _: m/ @7 V9 J9 ^% r8 @
4 e: c2 ]! B$ [. z) m q O$ I) e
# M+ }6 ^( C2 l4 ? f. T4 n9 b2 A! ~2 D
' a/ S- o, [/ R$ D+ V4 l2 z
|
|