第一章:MATLAB基础知识
一.MATLAB系统环境
-
matlab主窗口
-
命令行窗口:完成大部分命令
命令提示符: >> 表示MATLAB处于准备状态
续行符:… 把下面的物理行看作本行的一个逻辑继续
-
当前文件夹 设置当前文件夹:1 在当前文件夹工具栏或当前文件夹窗口选择某文件夹为当前文件夹 2 使用cd命令 先在E盘建立一个work文件夹 然后在MATLAB命令行窗口使用cd 命令将work文件夹设置为当前文件夹(cd e:\work)
注意:先建立文件夹,再将其设为当前文件夹
-
工作区窗口 存储各种变量和结果 可以对变量进行编辑 保存 删除等操作
>> clear
>> x=sin(1) %%求sin(1)的弧度值
x =
0.8415
>> sin=[1,2,3,4,5] %%给sin赋值
sin =
1 2 3 4 5
>> x=sin(1) %%引用sin的第一个值
x =
1 %%要想恢复sin函数则需要删除定义的函数名
%%定义函数名是尽量不要使用MATLAB内部的函数名
如何设置文件搜索路径 1.用path命令设置文件搜索路径(>>path,‘e:\work’)
2.用对话框设置文件路径(主页——设置路径)
二.MATLAB数值数据
数据类型:
- 整型(有/无符号)数据范围 数据类型转换
>> x=int8(129) %%有符号8为整型
x =
int8
127 %%有符号8位整型最大输出127 129已超出范围
>> x=uint8(129) %%无符号8位整型最大值为255 可以正常输出129
x =
uint8
129
-
浮点型
single单精度型
double双精度型
>> class(4) ans = 'double' %%数值数据默认是双精度型 >> class(single(4)) ans = 'single'
-
复型 实部和虚部默认是双精度型 虚数单位i j
real函数:求复数的实部
imag函数:求复数的虚部
format命令的格式符 只影响输出格式,不影响数据的计算和存储
>> format long %%用format函数设置输出格式 >> 50/3 ans = 16.666666666666668 >> format >> 50/3 ans = 16.6667
-
常用数学函数
1.函数调用 : 函数名(函数自变量的值)
>> A=[4,2;3,6] %%定义矩阵A A = 4 2 3 6 >> B=exp(A) %%求自然指数 B = 54.5982 7.3891 20.0855 403.4288
2.函数的应用:三角函数有以弧度和角度为单位的函数,若以角度为单位则在函数名后加"d"以示区别
>> sin(pi/2) ans = 1 >> sind(90) ans = 1
3.abs函数可以求实数的绝对值,复数的模,字符串的ASCII码值
>> abs(-4)
ans =
4
>> abs(3+4i)
ans =
5
>> abs('a')
ans =
97
4.用于取整的函数有fix,floor,ceil,round
round函数按照四舍五入的规则取整
ceil函数是向上取整,取大于等于这个数的第一个整数
floor函数是向下取整,取小于等于这个数的第一个整数
fix函数是固定取靠近0的那个整数,即舍去小数取整
>> round(4.7)
ans =
5
>> floor(3.6)
ans =
3
>> ceil(-3.8)
ans =
-3
>> fix(-3.2)
ans =
-3
5.分别求一个三位正整数a的个位数字,十位数字和百位数字
个位数字(b):a除以10的余数
十位数字(c):a除10取整后得到的数再除以10求余
百位数字(d):a除以100
————求余函数可以使用rem函数mod函数————
>> m=345;
>> m1=rem(m,10) %m除以10之后求余
m1 =
5
>> m2=rem(fix(m/10),10) %%先用fix取整得34,再调用rem除以10后求余
m2 =
4
>> m3=fix(m/100) %%取整
m3 =
3
6.求【1,100】区间的所有素数
MATLAB提供判断n是否为素数的函数:isprime(n)是素数返回1,否则为0
>> x=1:100; %%调用1~100之间所有的数
>> k=isprime(x); %%调用isprime函数生成k向量 k向量中的元素要么为1要么为0
>> k1=find(k); %%从k向量中寻找为1的向量的序号
>> p=x(k1)
p =
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
三.变量及其操作
- 变量与赋值语句
变量本质上是内存单元的一个抽象 通过变量名可以访问内存单元
在MATLAB中,变量名是以字母开头,后接字母,数字或下划线的字符序列,最多63个字符
变量名区分大小写 标准函数名以及命令名一般用小写字母
赋值语句的格式 1.变量=表达式 2.表达式(将表达式的值赋给MATLAB的预定义变量ans)
若在赋值语句的后面加分号,那么MATLAB仅仅执行赋值操作,不会显示运算后的结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wmv3mXAi-1649903431978)(C:\Users\LENOVO\AppData\Roaming\Typora\typora-user-images\image-20220403205150645.png)]
>> x=sqrt(7)-2i;
>> y=exp(pi/2);
>> z=(5+cosd(47))/(1+abs(x-y))
z =
1.4395
-
MATLAB的预定义变量(系统本身定义的变量)
ans是默认赋值变量
i和j代表虚数单位
pi代表圆周率
NaN代表非数(绘图时若想裁掉一部分,那么把那部分的坐标设为NaN就可以了)
-
变量的管理
1.内存变量的删除和修改
2.who和whos用于显示在MATLAB空间中已经驻留的变量名清单
>> who 您的变量为: x y z >> whos Name Size Bytes Class Attributes x 1x1 16 double complex y 1x1 8 double z 1x1 8 double
-
内存变量文件
用于保存MATLAB工作区变量的文件叫做内存变量文件,其扩展名为.mat也叫MAT文件
save命令:创建内存变量文件
load命令:装入内存变量文件
>>save mydata a x %%a和x是要存入的变量 >>load mydata
四.MATLAB矩阵的表示
-
矩阵的建立
1.直接输入法建立矩阵
>> A=[1,2,3;4,5,6;7,8,9] %%同一行可以用空格或逗号分隔,不同行之间用分号分隔 A = 1 2 3 4 5 6 7 8 9
2.利用已经建好的矩阵建立更大的矩阵
>> A=[1,2,3;4,5,6;7,8,9]; >> B=[-1,-2,-3;-4,-5,-6;-7,-8,-9]; >> C=[A,B;B,A] C = 1 2 3 -1 -2 -3 4 5 6 -4 -5 -6 7 8 9 -7 -8 -9 -1 -2 -3 1 2 3 -4 -5 -6 4 5 6 -7 -8 -9 7 8 9
3.用实部矩阵和虚部矩阵构成复数矩阵(矩阵要同型)
>> B=[1 2 3;4 5 6]; >> C=[6 7 8;9 10 11]; >> A=B+i*C %%i与矩阵C中的每一个元素相乘 A = 1.0000 + 6.0000i 2.0000 + 7.0000i 3.0000 + 8.0000i 4.0000 + 9.0000i 5.0000 +10.0000i 6.0000 +11.0000i
-
产生行向量的其他方式
1.冒号表达式
格式:e1:e2:e3(e1为初始值,e2为步长,e3为终止值)
若省略步长e2,则步长为1
>> t=0:1:5 %%等价于t=0:5 t = 0 1 2 3 4 5
2.linspace函数
格式:linspace(a,b,n) (a是生成向量的第一个元素,b是生成向量的最后一个元素,n是元素总数)
当 n省略时自动产生100个元素
>> x=linspace(0,pi,6)
x =
0 0.6283 1.2566 1.8850 2.5133 3.1416
-
结构矩阵(把不同类型的数据放在同一个矩阵中)
格式:结构矩阵元素.成员名=表达式
>> a(1).x1=10;a(1).x2='liu';a(1).x3=[11,21;34,78]; >> a(2).x1=12;a(2).x2='wang';a(2).x3=[34,191;27,57]; >> a(3).x1=14;a(3).x2='cai';a(3).x3=[13,890;67,231];
-
单元矩阵(用大括号括起来)
>> b={10,'liu',[11,21;34,78];12,'wang',[34,191;27,578];14,'cai',[13,890;67,231]} b = 3×3 cell 数组 {[10]} {'liu' } {2×2 double} {[12]} {'wang'} {2×2 double} {[14]} {'cai' } {2×2 double}
五.矩阵元素的引用
-
通过下标引用
A(3,2)表示A矩阵第三行第二列的元素
>> A(3,2)=200 %%设定一个元素的值,其余被默认为0 A = 0 0 0 0 0 200 >> A=[1,2,3;4,5,6]; %%MATLAB可以自动扩展原来的矩阵 >> A(4,5)=10 A = 1 2 3 0 0 4 5 6 0 0 0 0 0 0 0 0 0 0 0 10
-
通过序号引用
>> A=[1,2,3;4,5,6]
A =
1 2 3
4 5 6
>> A(3) %%第一个元素是1,第二个元素是4,第三个元素是2……是按列数的
ans =
2
矩阵元素的序号与下标可以利用sub2ind和ind2sub函数实现相互转换
sub2ind函数:将矩阵中指定元素的行列下标转换成存储的序号
调用格式:D=sub2ind(S,I,J) S:行数和列数组成的向量,可以通过size函数获取
I:转换矩阵元素的行下标
J:转换矩阵元素的列下标
D:对应下标元素的序号
>> A=[1:3;4:6]
A =
1 2 3
4 5 6
>> D=sub2ind(size(A),[1,2;2,2],[1,1;3,2]) %%A(1,1)=1,其序号为1;
A(2,1)=4,其序号为2……
D =
1 2
6 4
ind2sub函数:将矩阵元素的序号转换成对应元素的下标
调用格式:[I,J]=ind2sub(S,D) I,J:行列下标
S:行数和列数组成的向量
D:序号
>> [I,J]=ind2sub([3,3],[1,3,5]) %%求一个3行3列的矩阵的序号为1,3,5的下标
I =
1 3 2
J =
1 1 2
-
利用冒号表达式获得子矩阵(矩阵中的一部分元素构成的矩阵)
用冒号表达式作为引用矩阵的下标
用单个的冒号来作为行下标或列下标(代表全部行或全部列)
A(i,:) 第i行的全部元素
A(:,j) 第j列的全部元素
A(i:i+m,k:k+m) 第ii+m行且在第kk+m列中的全部元素
A(i:i+m,:) 第i~i+m行的全部元素
>> A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15] A = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 >> A(1:2,:) ans = 1 2 3 4 5 6 7 8 9 10 >> A(2:3,1:2:5) %%引用第二行和第三行的第一列,第三列,第五列的全部元素(2表示步长) ans = 6 8 10 11 13 15
-
end运算符:表示某一维的末尾元素下标
>> A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15;16,17,18,19,20]; >> A(end,:) %%引用矩阵A的最后一行元素 ans = 16 17 18 19 20 >> A([1,4],3:end) %%引用第一行和第四行的从第三列到最后一列的元素 ans = 3 4 5 18 19 20
-
如何删除矩阵中的元素
1.利用空矩阵删除矩阵中的元素(空矩阵是指没有任何元素的矩阵)
>> x=[] %%x是一个空矩阵 x = [] >> A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15] A = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 >> A(:,[2,4])=[] A = 1 3 5 6 8 10 11 13 15
2.改变矩阵的形状
reshape(A,m,n):在矩阵总元素保持不变的前提下,将矩阵A重新排列成m*n的二维矩阵(即reshape函数只改变原矩阵的行数和列数,不改变原矩阵的元素个数及其存储顺序)
>> x=[23,45,65,34,65,34,98,45,78,65,43,76] x = 23 45 65 34 65 34 98 45 78 65 43 76 >> y=reshape(x,3,4) %%调用reshape函数建立3行4列的矩阵 y = 23 34 98 65 45 65 45 43 65 34 78 76
A(😃:将矩阵A的每一列元素堆叠起来,成为一个列向量
>> A=[-45,65,71;27,35,91] A = -45 65 71 27 35 91 >> B=A(:) %%A(:)等价于reshape(A,6,1) B = -45 27 65 35 71 91
六.MATLAB基本运算
-
算术运算
1.基本算数运算 + — * / (右除) \ (左除) ^(乘方)
MATLAB的算术运算是在矩阵意义下进行的,单个数据的算术运算只是矩阵运算的一种特例
1)加减运算
若两矩阵同型,则运算时两矩阵的相应元素相加减
若两矩阵不同型,则会给出错误信息
一个标量也可以和矩阵进行加减运算,这时把标量和矩阵的每一个元素进行加减运算
2)乘法运算
矩阵A和B进行乘法运算,要求A的列数和B的行数要相等,称为A和B矩阵是可乘的,或称A和B两矩阵维数和大小相容 若维数和大小不相容,则系统会给出错误信息
3)除法运算
如果A矩阵是非奇异方阵,则B/A等效于B**inv(A) , A\B等效于inv(A*)*B (inv表示逆矩阵)
对于矩阵来说,右除和左除表示两种不同的除数矩阵和被除数矩阵关系
一般,B/A!=B\A
>> A=[1,2,3;4,2,6;7,4,9]; >> B=[4,3,2;7,5,1;12,7,92]; >> C1=B/A %%B右除以A C1 = -0.1667 -3.3333 2.5000 -0.8333 -7.6667 5.5000 12.8333 63.6667 -36.5000 >> C2=A\B %%B左除以A C2 = 0.5000 -0.5000 44.5000 1.0000 0.0000 46.0000 0.5000 1.1667 -44.8333 ————————————————————————————————————————————————————- %%对于含有标量的运算,两种除法运算的结果相同 >> 3/4 ans = 0.7500 >> 4\3 ans = 0.7500 >> a=[10.5,25] %%a为一个向量 a = 10.5000 25.0000 >> a/5 ans = 2.1000 5.0000 >> 5\a ans = 2.1000 5.0000
4)乘方运算
A^x 要求A为方阵,X为标量
>> A=[1,2,3;4,5,6;7,8,0]; >> A^2 %%即A*A ans = 30 36 15 66 81 42 39 54 69
2.点运算
.* ./ .\ .^
- 两矩阵进行点运算是指它们的对应元素进行相关运算,要求两矩阵同型
>> A=[1,2,3;4,5,6;7,8,9]; >> B=[-1,0,1;1,-1,0;0,1,1]; >> C=A.*B C = -1 0 3 4 -5 0 0 8 9 >> D=A*B D = 1 1 4 1 1 10 1 1 16 —————————————————————————————————————————————————————— >> x=0.1:0.3:1; %%求x=0.1,0.4,0.7,1时,y=sinx cosx的值 >> y=sin(x).*cos(x) %%必须要用点乘(X是一个向量sinx和cosx长度相同) y = 0.0993 0.3587 0.4927 0.4546 >> y=sin(x)*cos(x) %%sinx和cosx相乘不相容 错误使用 * 用于矩阵乘法的维度不正确。请检查并确保第一个矩阵中的列数与第二个矩阵中的行数匹配。要执行按元素相乘,请使用 '.*'。
-
关系运算(条件运算)
< <= > >= == ~=
当两个比较量是标量时,直接比较两数的大小,若关系成立,关系表达式结果为1,否则为0
>> 3>4 ans = logical 0 >> x=5 x = 5 >> x==5 ans = logical 1
当参与比较的量是两个同型的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,最终的关系运算结果是一个与原矩阵同型的矩阵,它的元素有0或1组成
当参与比较的一个是标量,另一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运算规则逐个比较,最终的关系运算结果是一个与原矩阵同型的矩阵,它的元素有0或1组成
>> A=[24,35,13;22,63,23;39,47,80] A = 24 35 13 22 63 23 39 47 80 >> P=rem(A,2)==0 %%矩阵A的每一个元素除以2的余数矩阵 判断是否为0,从而判断A的元 素是否为偶数 P = 3×3 logical 数组 %%元素为1的就是偶数 1 0 0 1 0 0 0 0 1
-
逻辑运算(0 1)
& | ~
%%在算术运算,关系运算和逻辑运算中,算数运算的优先级最高,逻辑运算优先级最低,但逻辑非运算是单目运算,它的优先级比双目运算要高 >> 3<4&6>5 ans = logical 1 >> ~(9==1) ans = logical 1 >> ~9==1 %%先作~9运算的结果为0 0==1结果为0 ans = logical 0
>> %%水仙花数是指各位数字的立方之和等于该数本身的三位正整数,求全部水仙花数 >> m=100:999; >> m1=rem(m,10); >> m2=rem(fix(m/10),10); >> m3=fix(m/100); >> k=find(m==m1.*m1.*m1+m2.*m2.*m2+m3.*m3.*m3) k = 54 271 272 308 >> s=m(k) s = 153 370 371 407 —————————————————————————————————————————————————————————————————— C语言实现 int main() { int hun, ten, ind, n; printf("result is:"); for( n=100; n<1000; n++ ) //整数的取值范围 { hun = n / 100; ten = (n-hun*100) / 10; ind = n % 10; if(n == hun*hun*hun + ten*ten*ten + ind*ind*ind) //各位上的立方和是否与原数n相等 printf("%d ", n); } printf("\n"); return 0; }
七.字符串处理
字符型数据(字符串数据)
数值型数据
- 字符串的表示
用单引号括起来
>> xm='Central South University' %%把字符串当做一个行向量
xm =
'Central South University'
>> xm(1:3) %%取行向量的第一到第三个元素
ans =
'Cen'
若字符串中的字符含有单引号,则该单引号要用两个人单引号来表示
>> 'I''m a teacher.'
ans =
'I'm a teacher.'
建立多行字符串,形成字符串矩阵
>> ch=['abcdef';'123456']; %%建立两行六列矩阵 当字符数目不同时,可以利用空格调节
>> ch(2,3)
ans =
'3'
>> %建立一个字符串向量,然后对该向量作如下处理:
>> % 1.取第1~5个字符组成的子字符串
>> % 2.将字符串倒过来重新排列
>> % 3.将字符串中的小写字母变成相应的大写字母,其余字符不变
>> % 4.统计字符串中小写字母的个数
>> ch='ABc123d4e56Fg9';
>> subch=ch(1:5)
subch =
'ABc12'
>> revch=ch(end:-1:1)
revch =
'9gF65e4d321cBA'
>> k=find(ch>'a'&ch<'z') %%找到小写字母赋给k(注意是小写字母的序号)
k =
3 7 9 13
>> ch(k)=ch(k)-('a'-'A')
ch =
'ABC123D4E56FG9'
>> length(k)
ans =
4
-
字符串的操作
1.字符串的执行
格式:eval(s) s是字符串 作用是 把参数字符串中的内容作为对应的MATLAB命令来执行
>> t=pi; %%pi为圆周率 >> m='[t,sin(t),cos(t)]'; >> y=eval(m) y = 3.1416 0.0000 -1.0000
2.字符串与数值之间的转换(字符串是以ASCII码形式储存的)
abs 和 double函数都可以用来获取字符串矩阵所对应的ASCII码数值矩阵
char函数可以把ASCII码矩阵转换为字符串矩阵
>> s1='MATLAB'; >> a=abs(s1) a = 77 65 84 76 65 66 >> char(a+32) ans = 'matlab'
3.字符串的比较
两种方法:利用关系运算符或者字符串比较函数
关系运算符比较:两个字符串里的每个字符依次按ASCII值大小逐个进行比较,比较的结果是一个数值向量,向量中的元素要么是1,要么是0
>> 'www0'>='W123' ans = 1×4 logical 数组 1 1 1 0
字符串比较函数用于判断字符串是否相等,有4种比较方式
1)strcmp(s1,s2):用来比较字符串s1和 s2是否相等,如果相等,返回结果为1,否则返回0
2)srtncmp(s1,s2,n):用来比较两个字符串前n个字符是否相等,如果相等返回1,否则返回0
3)strcmpi(s1,s2):在忽略字母大小写前提下,比较字符串s1和s2是否相等,若果相等返回1……
4)strncmpi(s1,s2,n):在忽略字符串大小写前提下,比较两个字符串前n个字符是否相等,如果相等返回1,否则返回0
>> strcmp('www0','W123') ans = logical 0 >> strncmpi('www0','W123',1) ans = logical 1
4.字符串的查找与替换
findstr(s1,s2):返回短字符串在长字符串中的开始位置
strrep(s1,s2,s3):将字符串s1中的所有子字符串s2替换为字符串s3
>> p=findstr('This is a test!','is') p = 3 6 >> p=findstr('is','This is a test!') p = 3 6 >> result=strrep('This is a test!','test','class') result = 'This is a class!'
行比较,比较的结果是一个数值向量,向量中的元素要么是1,要么是0
>> 'www0'>='W123'
ans =
1×4 logical 数组
1 1 1 0
字符串比较函数用于判断字符串是否相等,有4种比较方式
1)strcmp(s1,s2):用来比较字符串s1和 s2是否相等,如果相等,返回结果为1,否则返回0
2)srtncmp(s1,s2,n):用来比较两个字符串前n个字符是否相等,如果相等返回1,否则返回0
3)strcmpi(s1,s2):在忽略字母大小写前提下,比较字符串s1和s2是否相等,若果相等返回1……
4)strncmpi(s1,s2,n):在忽略字符串大小写前提下,比较两个字符串前n个字符是否相等,如果相等返回1,否则返回0
>> strcmp('www0','W123')
ans =
logical
0
>> strncmpi('www0','W123',1)
ans =
logical
1
4.字符串的查找与替换
findstr(s1,s2):返回短字符串在长字符串中的开始位置
strrep(s1,s2,s3):将字符串s1中的所有子字符串s2替换为字符串s3
>> p=findstr('This is a test!','is')
p =
3 6
>> p=findstr('is','This is a test!')
p =
3 6
>> result=strrep('This is a test!','test','class')
result =
'This is a class!'
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IDVP6w1G-1649903431980)(C:\Users\LENOVO\AppData\Roaming\Typora\typora-user-images\image-20220403215155559.png)]