Matlab学习笔记.docx
《Matlab学习笔记.docx》由会员分享,可在线阅读,更多相关《Matlab学习笔记.docx(18页珍藏版)》请在冰豆网上搜索。
![Matlab学习笔记.docx](https://file1.bdocx.com/fileroot1/2023-1/9/13fda7ff-41f9-406e-92d8-ff05f4951bac/13fda7ff-41f9-406e-92d8-ff05f4951bac1.gif)
Matlab学习笔记
基础知识
重要知识
●;语句结束,屏蔽显示,提高编译效率
●...分行书写
●Size获取矩阵的尺寸
●0.01可以简写为.01
●Matlab中运算表达式中更改优先级的括号()和[]均可以,但是函数参数中必须要用()
●‘转置运算法
●clc清屏(命令窗口)
●clear清除变量
●%行注释
●Who/whos查看工作空间变量
●Plot绘图函数
X=0:
0.1:
6;
Y=sin(x);
Plot(x,y);
●帮助
Helpdesk
Doc
Helpwin
HelpXXX索引帮助
Lookfor***内容查找
●Diary
Diaryfilename命令窗口日志(命令窗口的输出和输入都会被保持到文件中)
Diaryoff终止日志写入
Dirayon重新日志写入
●常用符号
+-*/^exp(自然指数)
Matlab搜索路径
Path:
查看搜索路径
Addpath增加目录到搜索路径
Path2rc增加当前目录到搜索路径
Rmpath移除matlab中的搜索路径
Pathtool图形化设置搜索路径
UserPath设置启动目录设置完后要savepath保持
Cd当前目录(不带参数直接显示当前目录)也可以像dos命令一样更改当前目录
which命令,它能帮助我们找到正在执行的m文件版本和它的路径(若有多个同名m文件,按照路径搜索顺序返回第一个)。
如果用户在MATLAB提示符后输入一个名字,那么MATLAB在解释器将按以下顺序
寻找这个名字:
1.它先查看这个名字是否是个变量名。
如果它是一个变量,MATLAB将会显示出这个
变量的值。
2.然后检查看它是否是内建函数或命令。
如果是,则执行对应的函数或命令。
3.检查是不是在当前目录下的一个M文件。
如果是,则执行对应的函数或命令。
4.检查是不是在MATLAB搜索路径的所有目录下的一个M文件。
如果是,则执行对
应的函数或命令。
注意:
如果首先检测到的是变量名,且这个变量名与MATLAB的某一个函数或命令同
名,那么这个函数或命令将变得无法访问。
这是初学者易犯的错误之一。
编程隐患
如果变量名与MATLAB中的函数或命令重名,那么这个函数或命令将不能被访问。
还有,如果有多个函数或命令重名,那么MATLAB将会执行在搜索路径中找到的第一
个,其他的将不会被执行。
对于初学者,这也是一个常见的问题,往往将M文件的名字与
MATLAB内建函数或命令重名,从而导致函数或命令的不能访问。
编程隐患
不
要创建和MATLAB内建函数或命令同名的M文件。
数据的显示
format改变默认显示格式
当数据重复在命令窗口(TheCommandWindows)时,整数以整形形式显示,其他值将以
默认格式显示。
MATLAB的默认格式是精确到小数点后四位。
如果一个数太大或太小,那
么将会以科学记数法的形式显示。
x=100.11
y=1001.1
z=0.00010011
x=
100.1100
y=
1.0011e+03
z=
1.0011e-04
format命令结果例子
formatshort保留小数点后4位(默认格式)12.3457
formatlong保留小数点后14位12.345678901234567
formatshorte带有5位有效数字科学记数法1.2346e+00
formatshortg总共有5个数字,可以用科学记数法,也可不用12.346
formatlonge带有15位有效数字科学记数法1.234567890123457e+001
formatlongg总共有5个数字,可以用科学记数法,也可不用12.3456789012346
formatbank美元格式12.35
formathex用16进制表示4028b0fcd32f707a
formatrat两个小整数的比1000/81
formatcompact隐藏多余的换行符
formatloose使用多余的换行符
format+只显示这个数的正负+
disp显示数据
另一种显示数据的方法是用disp函数。
disp需要一个数组参数,它将值将显示在命令窗口(TheCommandWindows)中。
如果这个数组是字符型(char),那么包含在这个数组中的字符串将会打印在命令窗口(TheCommandWindows)中。
此函数可联合num2str(将一个数转化为字符串)和int2str(将一个整数转化为字符串)来产生新的信息,显示在命令窗口(TheCommandWindows)中。
例如,下面的语句将“thevalueofpi=3.1416”显示在命令窗口(TheCommandWindows)中。
第一句创建了一个字符型数组,第二句用于显示这个数组。
>>str=['thevalueofpi='num2str(pi)];定义字符数组,数组元素间空格或逗号间隔均可
>>disp(str);
thevalueofpi=3.1416
b=[789];
>>disp(b)
789
fprintf格式化显示数据
用fprintf函数显示数据是一种十分简便方法。
fprintf函数显示带有相关文本的一个或多个值,允许程序员控制显示数据的方式。
>>fprintf('thevalueofpiis%6.2f\n',pi)%\n别忘了,否则命令提示符>>紧跟在字符串
thevalueofpiis3.14%后面,很难看
fprintf函数有一个重大的局限性,只能显示复数的实部。
当我们的计算结果是复数时,这个局限性将会产生错误。
在这种情况下,最好用disp显示数据。
formatstring结果
%d把值作为整数来处理
%e用科学记数法来显示数据
%f用于格式化浮点数,并显示这个数
%g用科学记数格式,或浮点数格式,根据那个短,并显示之
\n转到新的一行
例如,下列语句计算复数x的值,分别用fprintf和disp显示
x=2*(1-2*i)^3;
str=['disp:
x='num2str(x)];
disp(str);
fprintf('fprintf:
x=%8.4f\n',x);
打印的结果如下
disp:
x=-22+4i
fprintf:
x=-22.0000
编程隐患
fprintf函数只能复数的实部,所以在有复数参加或产生的计算中,可能产生错误的结果。
数据的保存
Save
Savefilenamevar1var2–ascii-append
为了与其他程序交互,使用-ascii为区分,扩展名建议用dat
Matlab自己用,不要-ascii,扩展名自动为mat,跨版本、跨平台matlab互认mat文件
Load
loadfilename-ascii
Matlab变量
变量名
MATLAB的变量名必须以字母开头,后面可以跟字母,数字和下划线(_).只有前31
个字符是有效的;如果超过了31个字符,基余的字符将被忽略。
如果声明两个变量,两变
量名只有第32个字符不同,那么MATLAB将它们当作同一变量对待。
在MATLAB语言中是区分字母大小的,也就是说,大写字母和小写字母代表的东西是不同的。
所以变量NAME,Name,name在MATLAB中是不同的。
所以已用过的小写变量名与一个新建大写的变量名重名,这时使用时要特别地小心。
在一般情况下,我们一律用小写字母来表示。
MatLab中变量名一般用小写,名称单词间用下划线_隔开。
Double和char型
两个最常见的变量类型是char型和double型。
double型的变量包括由64位双精度浮点数构成的标量或数组。
这种变量可以代表实数,虚数和复数。
每个值的实部和虚部的变化范围为正负10-308~10308,拥有15到16位有效数字。
这是基本的数字数据类型。
无论什么时侯,你将一个数值赋值于一个变量名,那么MATLAB将自动建立一个double型变量。
例如,下面语句创建了一个以var为变量名的double型变量,包含了一个double型的单个元素,存储了复数值(1+i);
Var=1+i;
char型的变量包括由16位数值构成的标量或数组,每一个16位数代表一个字符。
这个类型的经常用于字符串操作,当一个字符或字符串赋值于一个变量名时,系统会自动建立一个char型变量。
例如,下面的这个语句创建了一个char型变量comment,并存储了一个字符串在其内。
当这个语执行后,系统将会建立一个1×26的字符串数组。
Comment=‘Thatisacharacterstring’;
变量赋值
1.用赋值语句初始化变量
2.用input函数从键盘输入初始化变量
3.从文件读取一个数据
特殊变量
函数用途
pi有15个有效值的π
i,j代表虚数i(−1)
Inf这个符号代表无穷大,它一般情况下是除以0产生的
NaN这个符号代表没有这个数。
它一般由数学运算得到的。
例如,0除以0。
clock这个特殊变量包含了当前的年,月,日,时,分,秒,是一个6元素行向量
date当前的日期,使用的的字符形式,如30-Dec-2007
eps变量名是epsilon的简写。
它代表计算能机辨别的两数之间的最小数
ans常用于存储表达式的结果,如果一个结果没有明确的赋值给某个变量
编程隐患
不要重定义有意义的预定义变量。
否则将后患无穷,制造成出小而难以发现的错误。
矩阵(数组)
矩阵的定义
a=2;%matlab中所有变量都认为是矩阵(1×1)
b=1:
0.1:
2//向量
c=[123]或c=[1,2,3]或c=[1,23]空格或逗号都可以分割元素
d=[123;%分号分割矩阵的行
456;
789]
e=[1,2,3%换行符分割矩阵的行,e为2×3维矩阵
4,56]
f=[1,2,3,%行尾3后面有个逗号,f仍为2×3维矩阵
4,5,6];
G=[1,2,3
4,5,6];%行首4前面有逗号,g仍为2×3维矩阵
[]为空数组,没有行,没有列,注意它与元素全为0的数组区别。
[1,2,3;4,5]这样的表达式是非法的,因为第一行有3个元素,第二行有只有2个元素.H=[01+7]g=[h
(2),h
(1)+5]数组可以用表达式初始化
当我们创建一个数组时,不是每一个元素都必须定义.如果要定义一个特殊的数组,或只
有一个或几个元素没有定义,那么之前的那些元素将会自动创建,并初始化为0.例如,如果数
组c事先没有定义,语句c(2,3)=5将会创建一矩阵
005
000
相似地,指定一个值赋予一个存在的数组,但超过了这个数组的大小。
例如,假设存在一数组d=[12],下面这个语句d(4)=4,将会制造出数组d=[1,2,04];
注意:
对于已定义的矩阵,已有一维向量才可以这样对越界外的位置赋值来扩展矩阵,二维或多维矩阵会报非法操作。
矩阵快捷赋值
Clone运算符
注意:
创建的结果first<=target<=last;first一定包含,last视步长情况可能包含,可能不包含。
First:
incr:
last克隆运算符(colonoperator),第一值,步增和最后一个值
first代表数组的每一个值,incr代表步增量,last代表这个数组的最后一个值。
如果步
增量为1,那么步增量可省略,而变成了first:
last格式。
例如,表达式1:
2:
10是创建一个1×5行向量[13579]的简便方法
克隆法创建[pi/100,2*pi/100,...,pi]的语句可以写作:
Angles=(.01:
.01,1)*pi;
F=[1:
4]’或(1:
4)’通过clone和转置得到一个4*1的列向量
G=1:
4;
H=[g’g’];//H为(两个列向量组成的)4×2矩阵
Zerosoneseye
Zeros
(2)//产生2×2方阵—元素全为0
Zeros(2,3)//2×3--元素全为0
C=[1,2;3,4];
D=zeros(size(c));//d的维数同c,元素为0
zeros(n)创建一个n×n零矩阵
zeros(n,m)创建一个n×m零矩阵
zeros(size(arr))创建一个与数组arr的零矩阵
ones(n)创建一个n×n元素全为1矩阵
ones(n,m)创建一个n×m元素全为1矩阵
eye(n)创建一个n×n的单位矩阵
eye(n,m)创建一个n×m的单位矩阵
length(arr)返回一个向量的长度或二维数组中最长的那一维的长度
size(arr)返回指定数组的行数和列数
>>eye(2,3)
ans=
100
010
>>eye(3,2)
ans=
10
01
10
Input初始化变量
>>my_val=input('Enterthevalue:
')
Enterthevalue:
23
my_val=23
>>my_val=input('Enterthevalue:
','s')
Enterthevalue:
25
当这个语句被编译时,MATLAB打印出字符串enteraninputvalue:
然后等待用户回复.如果要只输入一个数,那么只需要直接键入,如果要输入一个数组,则必须带上中括号([]).不管怎样,当按下回车键时.在窗口输入的任何值都会被储入变量my_val.如果只按下回车键,那么这个变量就存储了一个空矩阵.如果input函数中有字符's'做为它的第二个参数,输入的数据就被当字符串
矩阵的元素访问(注意:
小括号):
d=[123;
456;
789]
d
(1)值为1//下标从1开始,0会报错,d(0)和d(10)越界都非法。
d
(2)值为4//matlab中矩阵元素按列存储,d
(2)为第二行第一个元素,而不是第一行第二个元素。
d(1,2)值为5//第一行、第二列的元素
sub2indind2sub
下标值转化为索引值
f=
123
456
>>sub2ind(size(f),2,2)
ans=4
b=
123
456
>>sub2ind(size(b),2,2)
ans=
4
>>[IJ]=ind2sub(size(b),4)//将索引4转换为坐标I中存储行坐标 J中存储列坐标
I=
2
J=
2
>>[IJ]=ind2sub(size(b),[34])//求索引3和4转换为行、列坐标
I=
12
J=
22
[IJ]=ind2sub(size(b),[34;56])//同时将3456转换为行、列坐标
I=
12
12
J=
22
33
多维数组
c(:
:
1)=[123;456];//注意c的是括号,还要求c未被定义,否则两个:
:
会从已定义的变量c中获取行、列值,赋值维数不匹配会报错。
>>c(:
:
2)=[111213;141516];
>>c
c(:
:
1)=
123
456
c(:
:
2)=
111213
141516
>>size(c)
ans=
232
数组的内存分配
一个有m行和n列的二维数组包括m×n个元素,这些元素在计算机的内存中将会占有m×n个连续的内存空间。
这些数组的元素在内存中是如何排列的呢?
MATLAB以列主导顺序分配数组中的元素。
也就是说,内存先分配第一列的元素,然后第二列,第三列,……以此类推,直到所有列都被分配完。
图2.3说明4×3数组a的内存分配情况。
正如我们所看到的,元素a(1,2)是其实在内存分配的第五个位置。
在下一节我们讨论用单一下标访问数组元素和第八章低级I/O接口,内存分配元素的顺序将变得十分重要。
行(row)列(colum)页(page)
这种分配方式也适用于多维数组。
数组的第一个下标增长最快,第二个仅次之,依此类推,最后一个变化最慢。
例如,在一个2×2×2数组中,它的元素在内存中的分配顺序是
(1,1,1),(2,1,1),(1,2,1),(2,2,1),(1,1,2),(2,1,2),(1,2,2),(2,2,2)。
子数组(end到行/列尾)
你可以选择和使用一个MATLAB函数的子集,好像他们是独立的数组一样。
在数组名
后面加括号,括号里面是所有要选择的元素的下标,这样就能选择这个函数的子集了。
例如,
假设定义了一个数组arr1如下
arr1=[1.1-2.23.3-4.45.5]
那么arr1(3)为3.3,arr1([14])为数组[1.1-4.4],arr1(1:
2:
5)为数组[1.13.35.5].
b=
123
456
>>b(:
1)//:
表示行全选,1表示第一列。
合起来是第一列(的所有行)
ans=
1
4
>>b(:
[12])//第1,2列
ans=
12
45
>>b(:
1:
2:
5)//1:
2:
5的结果是[135],列5越界
Indexexceedsmatrixdimensions.
>>b(:
1:
2:
3)//1:
2:
3的结果是[13],取1,3列
ans=
13
46
又如:
a=
123
456
789
>>a([12],[12])
ans=
12
45
End(到行/列尾)
>>a(2:
end,:
)
ans=
456
789
子数组在左边的赋值语句的使用
只要数组的形(行数和列数)和子数组的形相匹配,把子数组放于赋值语句的左边用来
更新数组中的值。
如果形不匹配,那么将会有错误产生。
例如,下面有一个3×4数组定义
arr4=
1234
5678
9101112
>>arr4(1:
2,[14])
ans=
14
58
>>arr4(1:
2,[14])=[2021;2223]
arr4=
202321
226723
9101112
>>arr4(1:
2,[14])=[202122;232425]
Subscriptedassignmentdimensionmismatch.
编程隐患
对于涉及子数组的赋值语句,等号两边的形必须相匹配。
否则将会产生错误。
用一标量来给子数组赋值
位于赋值语句的右边的标量值总是能匹配左边数组的形。
这个标量值将会被复制到左边
语句中所对应的元素。
例如,假设用一个数组arr4定义如下:
arr4=
1234
5678
9101112
>>arr4(1:
2,1:
2)
ans=
12
56
>>arr4(1:
2,1:
2)=1
arr4=
1134
1178
9101112
Matlab的运算
标量间的运算+-*/^
数组和矩阵运算
运算MATLAB形式注释
数组加法A+B数组加法和矩阵加法相同
数组减法A–B数组减法和矩阵减法相同
数组乘法(数乘)A.*BA和B的元素逐个对应相乘.两数组之间必须有相同的形,或其中一个是标量.
矩阵乘法A*BA和B的矩阵乘法.A的列数必须和B的行数相同.
数组右除法A./BA和B的元素逐个对应相除:
A(i,j)/B(i,j)两数组之间必须有相同的形,或其中一个是标量.
数组左除法A.\BA和B的元素逐个对应相除:
B(i,j)/A(i,j)两数组之间必须有相同的形,或其中一个是标量.
矩阵右除法A/B矩阵除法,等价于A*inv(B),inv(B)是B的逆阵
矩阵左除法A\B矩阵除法,等价于inv(A)*B,inv(A)是A的逆阵
数组指数运算A.^BAB中的元素逐个进行如下运算A(i,j)^B(i,j),A(i,j)/B(i,j)两数组之间必须有相同的形,或其中一个是标量.
运算优先级
1)括号里的内容先运算,从最里面的括号去运算
2)幂运算,从左向右
3)乘除法,从左向右
4)加减法,从左向右
Matlab的内建函数
maxmin选择性结果,多返回值
与数学的函数不同,MATLAB函数返回一个或多个值给调用函数。
max函数就是这样
的一个例子。
这个函数一般情况下返回输入向量中的最大值,但是它返回的第二个参数是输
入向量中的最大值在向量中的位置。
例如,语句
maxval=max([1-56-3])
返回的结果为maxval=6,但是要有两个返回值,那么这个函数包括最大所处的位置。
[maxvalindex]=max([1-56-3])
将会产生结果maxval=6,和index=3.
数组作为输入参数
许多MATLAB函数定义了一个或多个标量输入,产生一个输出。
例如,语句y=sin(x)
计算了x的正弦,并将结果存储到y变量中。
如果这些函数接受了输入值构成的数组,那么
MATLAB将一一计算出每个元素所对应的值。
x=[0pi/23*pi/22*pi]
那么语句
y=sin(x)
将会产生y=[01-1-0].
Matlab系统函数
函数描述
●数学函数
abs(x)计算x的绝对值
acos(x)计算x的反余弦函数
angle(x)计算复数x的幅角
asin(x)计算x的反正弦函数值
atan(x)计算x的反正切函数值
atan2(y,x)tan-2(y/x)
cos(x)cosx
exp(x)ex
log(x)logex
[value,index]=max(x)返回x中的最大值,和它所处的位置
[value,index]=min(x)返回x中的最小值,和它