EDA365电子论坛网
标题:
Matlab语言基础
[打印本页]
作者:
ubeautqq
时间:
2021-7-28 13:26
标题:
Matlab语言基础
: ~6 U# h! A8 |! K% R% W/ I
Matlab用C开发,C语言属于强类型语言,变量在使用之前必须强制声明,而matlab则属于弱类型语言,通过赋值就可以创建变量变量类型取决于创建时的类型,而不需要强制声明。
; q9 L+ a, |, i, G
J/ R5 [9 J. v
关于数组
% L1 |( Z9 U1 j: X, K! x( Z' A
Matlab的变量和运算是以数组(矩阵)为基础
2 o/ Z4 s2 w8 y4 q
数组分为
. }8 \, D, P" \
●向量:一维数组
7 r5 C4 I3 L; d* _3 l7 Z4 V8 m
●矩阵:二维/多维数组
+ w6 w0 v9 |# `3 L1 C
●标量:1行1列数组
5 c% A! [. y/ S# B3 @
! ^/ C3 \- T6 Q
数组的创建:1.用”[]”操作符直接创建 2.用函数创建
, X5 p j) z/ x
; J- n6 W: A, U0 ~; o- x! a
数组元素的访问(matlab中数组所有下标都从1开始)
) C# z! e& j1 q [# t
而且matlab中,下标都是从1开始的
! i* J2 a1 `/ I5 ?$ T8 }
有3中方式
4 M. g0 o# a9 w6 B2 c5 r1 Z
●全下标:a(m,n…)—第m行,第n列
* A7 t8 q8 ^% J. c$ o
●单下标:a(index)—在内存中,matlab数组是按列保存的,全部元素按列排成一个大向量,index就是向量的索引。
/ I8 }6 r2 N! ], S) I
●逻辑1方式:建立一个与矩阵同型的逻辑型数组,抽取该数组为1的位置对应的元素。
( X( F, W1 n7 z$ {2 i4 d
9 t6 d* T' F6 S6 l9 m- J5 Y
如:
& q; O0 {1 e) K9 d) `
( M2 Z2 |. ^$ s/ O1 h. g
>> a=[1,2,3;4,5,6];
, u7 t) i( D+ n& _2 D. v9 R6 h
* _6 B% b( H. A# `) J- r
>> a(2,1) %第2行第1列
) V1 d0 S, G. } o
* e9 I& e/ e; ]4 ?9 H6 R: {' n
2 x$ G1 E" U7 |9 x
( U9 {. H$ ?( j3 H( C# L- Z
ans =
& ~$ F1 w C/ D: M$ T" ~
8 L9 E; D$ ~1 f" }
" g" O# w* \6 i9 W5 l7 S5 n2 I4 d$ Q
2 s* }. ?4 M/ v, F X
4
. i, z2 h$ D0 {8 T; y2 O' n# A
1 x$ N" e$ l8 R6 Z
) G' P2 t; d. ]! y$ I1 Y! W8 w
4 I! O+ ~0 E3 A1 N% F
>> a(2) %第2个元素
- X0 `( g$ @7 _- l, T
: p% Y H: `9 q+ H! A7 S- h
! Q4 J$ Z& ]( k7 \5 V" L5 R
7 Z3 t$ Q' |: U) b
ans =
; E- N. O3 D6 I' {. U0 ~1 B+ a
. B( d# e" l% a& B5 z/ j
8 z# v" ^% [5 \8 H# g* k
, q, k6 b6 ]1 ~+ x8 g% W+ u
该维数中的第几
8 V9 O# K/ b2 M) q+ l; i. W' k* I
5 e$ e4 M5 J P7 z
$ V7 ~3 ~$ x( c0 o8 Q/ k! z8 X
1 K! [% n4 c+ f3 f# a# Z5 `
* T, A7 U/ Y' F& C
4
8 E7 k' ~1 J& g
- N5 [- k1 k! F8 r% M2 K; H
& h) H( G0 I* }" i. n8 O
1 C- O9 H- i2 |/ b
>> a(2,[1,3]) %第2行的第1和第3列元素
: m: ~- [' W j+ S2 E& A
2 J/ E. v5 p' r9 j( P" u
& V7 r6 |* K7 \5 c/ N
* e9 M' I' Z9 z7 c) ^; D+ M3 m' b
ans =
! T- D: G# u' p* _5 R9 g1 [
9 p e& {( p) N+ q, p# z9 S: z
! @1 d; C4 r4 [6 |$ C
; h) ?, o! |# E* j& U" f
4 6
% ?, a0 f4 w2 Z& k- j3 E$ d
4 M& O7 G8 R! r& V y, y! v" m
>> a(:,2) %第2列
4 X* s& r: ?+ K/ V3 }
: q7 J$ Q$ Z) l4 N5 _' U
) s2 P! U. O. G/ l* f" e j$ g
# \8 d4 m. O9 X
ans =
3 E: }# K ?' F
$ m$ o+ N+ k u2 I+ v
# d$ `1 l( G, Q8 Y& ?
, g! J" F6 Z3 @2 v H
2
/ V! `* U! p2 P$ Q# e' x
/ L. h; z) o% z- H$ r" ^8 I
5
7 R+ [+ B' J$ Y( N% A
& i, q* b4 ^! q2 C$ D+ w* D
9 n( z; Q9 y8 H- S6 {$ e5 j
T: K% @2 t* |) D- z- y+ p& z
>> a(2,:) %第2行
2 g, i+ Y, V# I. b2 P: O/ r' O
5 a# _9 b0 O- ^: N W3 X
, K. E; H G$ @) P" w; C
: ?1 l0 e$ b8 M: @7 a
ans =
# n3 _' W; r3 L+ e
, z7 N. m: J2 }
0 y( u6 U# O- @+ s" ^, N! }$ ]1 E- F
4 V* @' T! A2 T9 C3 L+ q! t
4 5 6
/ A( H; c' ]0 A3 ] Y
/ L* \1 j# L0 K: `) T
9 P7 e! R \% b" M9 d4 T
6 Z. J# x8 z/ e
>> a([1,2],[1,3]) %第1,2行中的第1,3行的数据(就是交点的位置的数据)
$ h3 F2 u& w. a
6 y0 ~1 W) `9 P, r7 Y6 U8 n
" | c4 m5 u$ x% m- P
1 z9 i( M8 u. K& s
ans =
2 M( f1 N+ j0 K0 |6 R" |' G
. U& L. ]( |+ [$ q& l
9 @; g4 a8 j7 I1 g
# F1 @( T+ C I, ^+ g7 u
1 3
& F% ]. o- _# ?% o; d
6 P* \' ?! n" I D$ P& W
4 6
# S W7 {* w# v4 j3 d* J' ]
& e& }8 w( r+ u3 O! _
, O" X4 M+ h6 ]: A: I0 \( m$ C
3 u- `. x" A+ t! f' W
>> a(2,2:end) %第2行中第2列到最后
7 l0 [4 g) l1 L
# f1 ~1 @9 H- `: y
- P! Q) ` D3 k9 u
) V6 a0 d/ I4 Q5 U4 L- ~; f0 W8 [
ans =
5 i% x& @3 Q3 t
4 V: x% r9 i& D8 R
" h7 M) u8 x' r: |/ D3 D1 f/ R
* J# V* o) P; q4 |9 J# X. s
5 6
2 q+ G! z" i* j
4 l' K' N; _% d5 D) M6 R3 _$ X
2.1数据类型
- T- y8 E* R: N9 X' M. A, h9 v
2.1.1整型
# w3 Y3 V8 C! f" J, r2 i
整型从字节数,有符号还是无符号两个方面可以分为int8,uint8,int16,uint16…等,int8表示一个字节长度的有符号整数,用intmax(‘int8’) 和intmin(‘int8’)返回int8所能表示的最大值127和-128.
/ X' }& ?" W6 E4 J; k
2 I. A9 B" Z" ~6 N# p
2.1.2浮点型
' [) j" u5 a$ r6 y; m1 d5 [
浮点型包括单精度single和双精度浮点数double.realmax(‘double’)和realmax(‘single’)分别返回两者能表示的最大值。
1 X3 O: B K5 t
常数数字默认类型是double
6 o4 ^7 P9 J; h8 d
>>class(pi)
, ~) H ~; W0 d* R) Q' l3 Q
ans=double
l- N& ^8 q- I4 l
>>class(2)
# w* p/ h3 M- R* U6 X- }2 {
ans=double
( T$ O6 L8 k( K9 t1 }
5 g7 v/ a6 X: U
2.1.3字符型
. O9 v7 [$ V, Z$ f; J
1、string=’matlab’,matlab中字符串使用单引号,字符串存储为字符数组,多个字符串可以形成矩阵,但每个字符串长度必须相等。
) l- F: s$ i& g$ x
2、字符串常用操作:
8 g2 {$ Y! ~ K. ^+ X. I0 R$ ?9 p' z: w
; q" H1 f2 T. Z" u+ X* z' i& |
字符串与数值的互换:str2num,num2str
1 q. u% y; e8 s- j& O: _$ H9 C* z
a=str2num(‘1234’)结果为a=1234
6 w' `9 W/ E6 z! d2 n8 e; `
Z- G( o* e8 D5 ?; _' k* w) V+ [$ }
获取字符ASCII值:double函数或abs()函数
" }+ X3 {/ d* y0 K5 g9 [/ d
double(‘a’)输出97
# ^/ g& d7 u! q4 I- R$ Z1 o, t
% x1 e+ H+ Z; H1 @5 M$ i
ASCII转为字符输出:char()
; n3 d) l8 v5 N) w! j, j7 V
char(97)则输出ans=a
1 T# J k9 ~. T
/ Z1 N% a6 u, f: C7 _
eval(‘t=1’);将’t=1’作为命令执行,结果是将1赋值为t
/ D; O) A& M5 J* G" ^, Y8 x7 a
# t! K, ^6 u2 u( W1 z2 R3 D1 {
2.1.4逻辑型
, L& r1 e1 e. ~
逻辑型变量只能取true(1)或者false(0),在矩阵操作中逻辑型变量非常有用。
5 w' f# _, S7 b; N0 j( j% J
5 u: q w8 ~" }
2.1.5结构体(类似于C语言中的结构体)
\' B3 w9 t5 S+ Y/ K1 x2 y, |
创建的两种方式:1.直接创建 2.利用struct函数创建
) {+ ^8 }0 `; o4 a( l
$ }. o& g4 ^4 U# [
例如:
3 p# z5 c M Y5 d+ ?' q3 v0 f
4 X% d8 z! L8 k/ k
第一种:
$ l, }- r" q% H
( M1 X& y0 a o& I
>> book.name='matlab';
6 f) l3 k% w# A6 g) s
& L7 N1 ?2 F$ C& {: S3 h
>> book.price=20;
+ \, C" `+ f( K& D: r, j7 i
6 c) p2 X( q) f3 d9 y% J
>> book.pubtime='2011';
% c" f* u) D* _' Y# h4 w
5 ~ t! d$ x+ f# n( v$ a' ]
>> book
( g( x0 P- }. t' V$ V# L
0 s! t8 V) r3 r" A2 m) x0 n
$ ~0 C% t+ m" ?5 c! ?* l
' Z. {" Q" Y! P, e
book =
8 D! L* K k5 h3 H
. w! j6 S4 W+ b2 t( U
7 b) _2 w5 c K
' {1 X" N+ }# t* @) H9 B9 u, A
4 ~- ]- D" W3 K w6 @8 X" r
& z' W- m& @3 W$ Q( O1 k/ n
字段
5 O5 c# l2 r' |" ?
, {: z# M# {4 l! c; S) i
, G* J& b5 k' K# b2 `% P' O
字段所对应的值
- D/ K3 M! q7 ] D7 d
( p% W; [+ ?" b. z
" \# T$ B: l! s' t+ U4 C# G
name: 'matlab'
/ p7 @; k, v: Q. S' X: S& E
' C. U2 [% g% Q+ s( m5 _( o( E
price: 20
# M6 P2 O( x* e5 ~
: p% @2 E$ \! Z, L# z
pubtime: '2011'
" A: D: X5 ]2 ^3 k, F
& M' N; C7 G+ r! d. r9 \
第二种:
+ c6 R" y5 ]3 Q2 L7 u, J" P
/ U& ^) ]: e3 {4 D$ {
>> book2=struct('name','matlab','price',20,'pubtime','2011');
2 b c% y5 ?$ U! I# c- U
) f/ c7 K) G8 Y, b
>> book2
( L1 J! b1 b( O
2 Q; e2 B, _3 C9 R. h& v$ _9 P a! K
3 v. o) R8 M6 A' S ~% T& k
8 n( @0 V& l( |' w; m( D+ l/ v$ `
book2 =
8 p" J0 X/ b, d0 Y" a* k$ l$ F
! [5 S# h% `) g- \
8 s1 o2 ?9 W) v9 l5 J
' x+ h$ s1 K. {0 }5 o) r, B
name: 'matlab'
6 x5 r9 q/ t6 p4 i& {
9 \, Z+ U$ v, n& ?2 A
price: 20
: l# }4 m- I( C" b6 z9 V( [! o
2 v9 m/ t. B1 a! k( ^2 m" g
pubtime: '2011'
7 P6 n2 r+ u. ` K! s
) Z4 T( g% i, d, U5 M! d3 a
对结构体中字段的访问用操作符”.”
& z* j* \# v C3 Z4 m
8 q' r( a( x" I2 K3 H, {" k
创建结构体数组
6 H% n2 `' d; |- S: t+ |: I
for i=1:10
% X$ {' ]1 z4 b3 B
$ ~' d I4 f# G; }! {
books2(i).name=strcat('book',num2str(i));
% w1 n9 B6 w$ c" I3 ^0 w
3 ^# Q, _( E5 D/ v
books2(i).price=20+i;
& V9 V5 h7 |0 B/ F( x6 l
" t/ }1 Q A( J7 b: A3 [8 [' c" X
books2(i).pubtime='2011';
8 @) e$ t% {% u' e3 F
) V: c' f, }) i* `2 _) f' W& I* W
end
/ i8 N, |" L9 ^' B8 W
1 K1 Q/ g+ }2 Z; ?2 Y
% x. j% ~: I7 E% k0 l' n( g0 q0 d6 J
- k$ u% ~: `# s+ `2 b
2.1.6元胞数组(类似于C#中非泛型集合)
7 V0 Q# I l9 K" e6 Y4 K
元胞数组的元素可以是任意类型的数据类型、任意纬度的常量
0 {3 i5 `+ \6 A2 p8 L. z
用”{}”操作符引用元素时,得到的是元素本身的类型,而使用”()”操作符时,得到的是一个元胞数组。
: H$ `2 I9 p) i1 a. @
5 Y! K1 w% b a& |- c0 q: ^ K
2.1.7函数句柄(取函数地址)
# ^* x% x7 }) O9 @, k( j
声明:1.用’@’符号直接声明
! C) b* T4 j4 Z
4 v* Q7 {& F& b& M+ B
2.用str2func函数声明
1 T* h6 ]6 n: s. ~) R8 R: ]
4 ]' K% i* H# ]2 w9 f% A
函数可以是预定义函数,也可以是用户自定义的函数,声明函数句柄以后,就可以像使用函数名一样使用百句柄了。
2 h3 ?! |1 u# A) O
>>ha=@sum;
& E- _5 J$ R6 i9 h+ N( e
>>hb=str2func(‘sum’);
" M- ?$ a- n# Z9 s2 E6 l' D7 o
>>functions(ha) %函数句柄包含的信息
1 T. w7 W8 `! W2 s
ans=
, q; `( v7 Q2 W& W$ R7 E s
function:’sum’
* \: F9 r& o$ ]5 X9 I9 J9 l
type:’simple’
H3 \9 T# p& N
file:’’
/ ^& e$ d4 w' o q
7 X3 a/ m! H0 [
函数句柄包含了函数的路径,函数名,类型及可能存在的重载方法,可用functions(function_handle)来显示函数信息。
% U) _0 Q0 g' T2 o6 P
- g9 ]. f7 `8 b9 A3 }/ N
使用函数句柄可以提高程序的运行速度,因为句柄包含了路径信息,系统不需要再每次调用时搜索一遍路径,而是直接找到函数的路径。正因如此,在系统切换工作路径时,不需要将函数文件复制过来就可以同样使用该函数。
! r0 ?& z! k9 x' R4 N* X! n
1 v5 ], ^" h4 B( N
函数句柄的另一种高级用法是声明一个匿名函数句柄,他指向一个表达式
; R2 q; M5 W8 C9 H
声明方法:变量名=@(输入参数列表)函数表达式
/ y0 ?2 J0 |" a4 T" K# m) a
>>hd=@(x,y)x.^2+y.^2;
n+ H4 K9 y( ^' c
! A' N3 Y+ o1 b% M. o* |) [ {
2.1 matlab运算符
7 x7 x: ~ A' ?, J2 @7 [
2.1.1 算术运算符
' O2 D( Z* Q @3 l
5 J$ W3 A+ k1 U/ ^* f3 H" S
分为矩阵的运算符和数组的运算符两大类
1 z- O+ C: C; T1 p+ l
$ Y6 g! H6 _6 q& {
其中矩阵运算符将矩阵作为整体,按线性代数的规则进行运算,而数组运算是在矩阵或数组中的对应元素之间进行的运算
t) A" W1 C/ \6 s9 f: J
3 [, w2 V( B e: O2 ?) I
矩阵运算符
P0 p: U y8 Z% ]2 W5 _8 B+ H
* { F$ h/ w( Y5 S9 f
1、+ ,-:加减 2、*:矩阵相乘 3、/:相除
, } l& c- `6 s3 y0 E
6 a ?1 {/ Z9 j( Q
4、\:矩阵左除,左边为除数 5、^:矩阵的乘方 6、.’ :转置
, a( u: z4 G$ W0 _: g# c
# M% D1 \3 k# b7 e
数组运算中(点运算)
% F2 L" b( o) }- M6 O. V# j
1、.*:对应元素相乘 2、.^:对应元素乘方 3、./:对应元素相除 4、.\:对应元素左除
( D8 C; m- G. E5 f
标量与数组的运算,是该标量与数组中每一个元素分别进行的运算。
1 s: P/ S/ _9 Z Y2 R
0 o- _! N# N* o, z
2.2 matlab流程控制语句
- E* S; N, |7 `2 F% c2 b- |" {
注意:不要忘了最后的end
; ]$ {. n9 Z+ i
( Y$ `! b. t2 ?) f
1、if表达式
6 n1 H- b" z1 F% ?# z9 |! e( B
语句;
! a1 _$ }/ N9 R) ]8 i3 x
, y q5 u, R0 r0 ?: _
end
1 }# x% Z# F! X% B( p
* d7 v! ^4 x& p# H$ ^6 c8 R8 E
2、if 表达式
: U3 g/ b( D8 H9 X- c. q
语句1
5 K3 S2 @4 J4 {0 G; a
( ~& |' K/ @# |3 z( O4 p: r; V
else
# j) A i) ?) ]2 g2 ]* h3 H9 s. B
, R3 Q" a6 O6 r+ j U+ X
语句2
* L, s6 F O* r T' X/ q' x
' o. u0 I! u5 O& s i: o9 r
end
1 u. C6 ]$ Z7 F% t6 ^# Y
- D' r' X) f- ~! S
3、switch 表达式
4 _; B* {6 X2 U
# o+ _, M) U* j1 g
Case 表达式1
5 ]4 |" z8 l% @2 z
0 `0 Y8 @. \2 G3 |1 a; }$ h2 V6 X
语句1
2 R7 Y4 R$ Q R5 L# K: c
1 w. B( T* @( z- z T0 \5 {6 A% V
Case 表达式2
/ |" y, J& t; X) E+ p, A; P
2 ]% D" D+ a$ H$ [# S% M/ g# k
语句2
P r. B* j* x! x8 E2 ^
…
- U8 Z8 i" L" F
4 ?( C5 R( d2 q# l8 D/ |8 V, }
Otherwise
+ a0 t* T" ~% B: N+ h
. \$ g: c3 E; h8 C
语句n
9 V; t( f$ k0 ~+ s: H
: o# E9 v1 e* H! j# Q1 F
end
x& ]4 z3 v2 D
! }# e3 e9 v6 ]4 w5 _
4、★
+ P X, ~$ \- y) @
for i=表达式
2 G0 k' {3 u1 y- H. c& o
" ~& U8 g$ b6 Q) o% \
语句
( q! Y+ y9 a+ S6 I* G
7 B$ K- d, w! l% O; P' H6 {( f: C. f
end
; W2 g! h* h: H1 m3 o
//能够遍历表达式中所有的元素
. A& P, l9 b& ^- q5 ^$ T
如:for i={‘abc’,’xyz’} %i为元胞数组
3 s; M" {( ^$ @3 J5 g8 v
& O) U7 g3 `' x/ g! O& Y6 r
disp(i{1});
9 f* L- `: ]2 A; W) y
: I+ T- y, k F+ x, x4 Q1 B
end
& w4 F |0 p5 ?, @* s& s6 U
" J" l- }8 G; A! r# R
输出:abc
% d+ X& \1 Y) H* _( Z6 [0 l9 Q
' w# W+ Y& G- n3 `2 K+ {& t @, {
xyz
0 X! y+ c* A7 p
, b* y0 d; o) K9 q0 ~! W% ^6 D
5、while 表达式
J4 \" b3 [& ]
8 P- T- }6 [* N3 F" q
语句
+ J5 ^9 Q O) d. \/ L
# m+ z$ z" e+ e( w1 B
end
5 v1 h0 W- p- E3 t. h) f M
c) r2 V |- L1 K7 N
作者:
regngfpcb
时间:
2021-7-28 14:23
matlab属于弱类型语言,通过赋值就可以创建变量变量类型取决于创建时的类型,而不需要强制声明
作者:
ExxNEN
时间:
2021-7-28 14:24
Matlab的变量和运算是以数组(矩阵)为基础
作者:
smileqq
时间:
2021-7-28 14:25
浮点型包括单精度single和双精度浮点数double
作者:
TTNA
时间:
2021-8-1 09:03
用上线性代数相关知识
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2