Matlab 的学习

matlab系统环境

matlab的搜索路径为:

变量,内部函数,程序文件(先搜索当前文件再在文件搜索路径下搜索)

  • 如果在当前文件夹和搜索路径文件夹下建立了一个同名的M文件,那么在命令行窗口输入文件名时,会执行哪个文件?
    • 答:执行当前文件夹下的文件
  • 如果用户建立的文件既没有保存在当前文件夹下,又没有保存在文件搜索路径中,那么在命令行窗口输入文件名时会出现什么信息?
    • 答:系统找不到,会报错

matlab数值数据

  • 整型数据 MatLab提供了数据类型转换函数来实现数据类型的转换。例如uint8函数将数值数据转换为无符号8位整数,int8函数将数值数据转换为带符号8位整数
1
2
3
4
5
>>x=int8(129)
x=
127 //因为带符号整数取值为-27次方到+27次方减1(-128~127),所以转换成带 >>x=uint8(129) 符号数的最大值127
x=
129 //不带符号数的取值为0~28次方减1(0~255)
  • 浮点型 在matlab中数值数据默认为浮点型,浮点型数据分为双精度和单精度两种,单精度占4个字节,双精度占8个字节,所以双精度型的数据精度更高。
    • single函数:将其他类型的数据转换为单精度型
    • double函数:将其他类型的数据转换为双精度型
1
2
3
4
5
6
>>class(4)
ans=
double
>>class(single(4))
ans=
single
  • 复型数据 复型数据包括实部和虚部两个部分,实部和虚部默认为双精度类型,叙述单位用i或者j来表示
    • real函数:求复数的实部
    • imag函数:求负数的虚部
1
2
3
4
5
6
>>6+5i
ans=
6.0000+5.0000i
>>6+5j
ans=
6.0000+5.0000i //这两个表示的是同一个负数
  • format命令的格式:formt格式符

1
2
3
4
5
6
7
>>format long
>>50/3
ans=
16.666666666666668 //小数点后15
>>format //默认short型
>>50/3
ans=16.66667 //小数点后5
format命令只影响数据输出格式而不影响数据的计算和存储

常用数学函数

  • 函数的调用格式为:

函数名(函数自变量的值) 函数的自变量规定为矩阵变量,当然也可以是标量,标量本身是矩阵的一种特例。函数在运算时是将函数逐项作用于矩阵的每个元素上,所以最后遇的结果就是一个与自变量同型的矩阵

1
2
3
4
5
6
7
>>A=[4,2,3,6]
A=
4 2
3 6
>>B=exp(A) //A把调用结果赋给B
B=54.5982 7.3891 //B最后结果也为和A一样的同型矩阵,并且对应的每个数字都是求对数字求自然指数得来的
20.0855 403.4288

matlab变量与数值语句

  • 在matlab中,变量以字母开头,后接数字或下划线,最多63给字符
    • 变量=表达式
    • 表达式赋值给matlab预定义变量ans

注意:如果在赋值语句后加;那么matlab仅仅执行赋值操作,不会显示运算后变量的结果

1
2
3
>>x=sqrt(7)-2i;
>>y=exp(pi/2);
>>z=(5+cosd(47)/(1+abs(x-y)))
  • ans是默认赋值变量
  • i和j代表虚数单位
  • pi代表圆周率
  • NaN代表非数
变量的管理:

(1)变量的删除和修改:可在工作区进行

  • who命令可以显示出驻留变量的名称
  • whos命令不仅显示出名称还会给出它们的大小、所占字节数及数据类型等信息

(2)内存变量文件:用于保存matlab工作区变量的文件叫做内存变量文件,其扩展名为.mat,也叫MAT文件(标准二进制文件)

  • save命令:创建内存变量文件
  • load命令:装入内存变量文件
    • 若变量a和变量x存在matlab工作空间中,可以执行命令 >>save mydate a x 这样就会把a和x保存在mydate.mat文件中
    • 在下一次重新进入matlab时,输入>>load mydate,就把mydate.mat文件中的内容装入matlab工作空间,那么在当前matlab工作环境中a和x已知

matlab矩阵的表示

  • 利用直接输入法建立矩阵:将矩阵的元素用中括号括起来,按矩阵行的顺序输入各个元素,同一行的各元素之间用逗号或空格分隔,不同行的元素之间用分号分隔
1
2
3
4
5
>>A=[1,2,3;4,5,6;7,8,9]
A=
1 2 3
4 5 6
7 8 9
  • 利用已经建立好的矩阵建立更大的矩阵:一个大矩阵由两个小的拼接而成
1
2
3
4
5
6
7
8
9
10
>>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
可以用实部矩阵和虚部矩阵构成复数矩阵
1
2
3
4
5
6
>>B=[1,2,3;4,5,6];
>>C=[6,7,8;9,10,11];
>>A=B+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
向量是矩阵的特殊类型,可以由冒号表达式产生行向量,也可用linspace函数产生一个行向量

格式:e1:e2:e3 //e1为初始值,e2为步长可省略默认为1,e3为终止值

​ linspace(a,b,n),a为第一个元素,b为最后一个元素,n为元素总数当n省略时将自动产生100个元素

1
2
3
4
5
6
7
>>t=0:1:5
t=
0 1 2 3 4 5

>>x=linspace(0,pi,6)
x=
0 0.6283 1.2566 1.8850 2.5133 3.1416

结构矩阵和单元矩阵

结构矩阵:数据类型不同而逻辑相关的数据组成一个有机整体,其中每个数据又构成了结构数据的一个成员(学生:学号,姓名,性别),学生这个结构数据,包含了这三个成员

格式:结构矩阵元素.成员名=表达式

eg.例如要建立含有三个元素的结构矩阵a,每个元素包含三个数据类型

我们只需要分别给结构矩阵a中的每个元素里的每个成员赋值就可以了

1
2
3
>>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,578];
>>a(3).x1=10;a(3).x2='liu';a(3).x3=[13,890;67,231];

单元矩阵:单元数据类型也是把不同数据类型放在一个变量中,单元矩阵的各个元素就是不同类型的数据,每个元素就是由不同数据类型组成的(而结构数据矩阵下的元素是由名字不同的成员构成) 建立单元矩阵和一般矩阵相似,直接输入就可以,只是单元矩阵元素用大括号括起来。

1
2
3
4
5
>>b={10,'liu',[11,21,34,78];12,'wang',[34,191;27,578];14,'cai',[13,890;67,231]}
b=
[10] 'liu' [2*2 double]
[12] 'wang' [2*2 double]
[14] 'cai' [2*2 double]

矩阵元素的引用

  • 通过下标来引用矩阵元素 A(4,5)第四行第五列

\[ >>A=[1,2,3;4,5,6]; >>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 //自动补0 \]

  • 通过序号引用 在matlab中矩阵元素按列存储,即首先存储矩阵的第一列元素,然后存储第二列元素一直存储到最后一列 矩阵元素的序号就是矩阵元素在内存中的排列顺序
    • 序号与下标是一一对应的,以m×n矩阵A为例,矩阵元素A(i,j)的序号为(j-1)×m+i
    • 矩阵元素的序号可以与下标可以利用sub2ind和ind2sub函数实现相互转换。
      • sub2ind函数:将矩阵中指定元素的行,列下标转换成存储的序号。调用格式为:D=sub2ind(S,I,J) S:行数和列数组成的向量 I:转换矩阵元素的行下标 J:转换矩阵元素的列下标 D:对应下标元素的序号
      • ind2sub函数:将把矩阵元素的序号转换成对应的下标。调用格式为:[i,j]=ind2sub(S,D) S:行数和列数组成的向量 D:对应下标元素的序号 I:转换矩阵元素的行下标 J:转换矩阵元素的列下标
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
>>A=[1,2,3;4,5,6]
A=
1 2 3
4 5 6
>>A(3)
ans=
2


//size函数的结果是由这个矩阵的行数和列数组成的一个矩阵
//sub2ind函数举例
>>A=[1:3;4:6]
A=
1 2 3
4 5 6
>>D=sub2ind(size(A),[1,2;2,2],[1,1;3,2])
D=
1 2
6 4


>>[I,J]=ind2sub([3,3],[1,3,5]) //求一个三行三列矩阵的第一个第三个第五个元素的下标
I=
1 3 2
J=
1 1 2

利用冒号表达式获得子矩阵(子矩阵是指矩阵中的一部分元素构成的矩阵)

1
2
3
4
A(i,:)           //第i行的全部元素
A(:,j) //第j列的全部元素
A(i:i+m,k:k+m) //第i~i+m行内且在第k~k+m列中的所有元素
A(i:i+m,:) //第i~i+m行的全部元素

end运算符:表示某一维的末尾元素下标

1
2
3
4
5
6
7
8
>>A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15;16,17,18,19,20];
>>A(end,:)
ans=
16 17 18 19 20
>>A([1,4],3:end) //第一行到第四行的第三列到最后一列的元素
ans=
3 4 5
18 19 20

利用空矩阵删除矩阵的元素,空矩阵是指没有任何元素的矩阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>x=[]
x=
[]
x是一个空矩阵

>>A=[1,2,3,0,0;7,0,9,6;1,4,-1,1,8]
A=
1 2 3 0 0
7 0 9 2 6
1 4 -1 1 8
>>A(:,[2,4])=[] //删除第二列和第四列的元素
A=
1 3 0
7 9 6
1 -1 8

改变矩阵的形状

reshape:在矩阵总元素保持不变的前提下,将矩阵A重新排成m×n的二维矩阵。reshape函数只是改变原矩阵的行数和列数,但并不改变原矩阵元素个数及其存储顺序

1
2
3
4
5
6
>>x=[23,45,65,34,65,34,98,45,78,65,43,76];
>>y=reshape(x,3,4) //就是把x矩阵变为3×4的矩阵
y=
23 34 98 65
45 65 45 43
65 34 78 76

A(:):将矩阵A的每一列元素堆叠起来,成为一个列向量

1
2
3
4
5
6
7
8
9
10
11
12
>>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基本运算(matlab的运算都是根据矩阵而言的)

  • 算数运算

    • 基本算数运算:基本运算符:+ , -, * , /(右除) ,  (左除),^(乘方) matlab的算数运算是在矩阵意义下进行的。单个数据的算数运算只是矩阵运算的一种特例
      • 加减运算必须是同型矩阵
      • 两矩阵相乘要求矩阵A的列数和矩阵B的行数相同
      • 有两种矩阵除法,如果A矩阵是非奇异方阵,则B/A等效于Binv(A),A(A) B
      • A^x乘方运算要求A为方阵,x为标量
    • 点运算:点运算符:.* , ./ , .  ,.^
      • 要求两个矩阵同型
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>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
    1
    2
    3
    //当x=0.10.40.71时,分别求y=sinxcosx的值
    >>x=0.1:0.3:1;
    >>y=sin(x).*cos(x); //这里必须用点乘,因为x是一个向量,sin(x)和cos(x)是和x同长度的向量,如果用乘法没用点乘就会出现不相容(A行不等B列)的情况
  • 关系运算

    • 关系运算符:<, >, <= ,>= ,==,~=(不等于) 若两个数是标量时,直接比较两个数大小,若关系成立则为1否则为0
      • 当参与比较的是两个同型的矩阵时,比较是对两矩阵位置的元素按标量关系运算规则逐个进行,最终的关系运算的结果是一个与原矩阵同型的矩阵,它的元素由0或1组成
      • 当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每个元素按标量关系运算规则逐个比较,最终的关系运算的结果是一个与原矩阵同型的矩阵,它的元素由0或1组成
1
2
3
4
5
6
7
8
9
10
11
12
//rem(A,2)是求A中每个元素除二的余数矩阵
>>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
P=
1 0 0
1 0 0
0 0 1
//P中元素为1的矩阵就是元素为偶数的位置
  • 逻辑运算
    • 逻辑运算符:&,|,~
      • a&b a和b要全是1,才为1
      • a|b a和b一个为1就是1
      • ~a a为0,运算结果为1;a为非0,运算结果为0
      • 当参与逻辑运算的是两个同型的矩阵时,比较是对两矩阵位置的元素按逻辑关系运算规则逐个进行,最终的逻辑运算的结果是一个与原矩阵同型的矩阵,它的元素由0或1组成
      • 当参与逻辑运算的一个是标量,而另一个是矩阵时,则把标量与矩阵的每个元素按逻辑关系运算规则逐个比较,最终的逻辑运算的结果是一个与原矩阵同型的矩阵,它的元素由0或1组成

算数运算的优先级最高,逻辑运算优先级最低,但逻辑非运算是单目运算,它的优先级比双目运算要高

1
2
3
4
5
6
7
8
9
10
//水仙花数
>>m1=100:999
>>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

字符串的处理

  • 在matlab中,字符串是用单引号括起来的字符序列
  • 若字符串中的字符有单引号,则该单引号字符要用两个单引号来表示
1
2
3
4
5
6
7
8
>>xm='Central South University'
>>xm(1:3) //取字符串的第1到第3个字符
ans=
Cen

>>'I "m a teacher.'
ans=
I'm a teacher.
  • matlab中可以建立多行字符串,形成字符串矩阵,字符串就相当于一个行向量,每个字符就是其中一个元素

字符串的操作

  • 字符串的执行:eval(s) 这里的s是一个字符串
1
2
3
4
5
>>t=pi;
>>m='[t,sin(t),cos(t)]';
>>y=eval(m)
y=
3.1416 0.0000 -1.0000
  • 字符串与数值之间的转换
    • abs和double函数都可以用来获取字符串矩阵所对应的ASCII码数值矩阵
    • char函数可以把ASCII码矩阵转换为字符串矩阵
1
2
3
4
5
6
7
>>s1='MATLAB';
>>a=abs(s1)
a=
77 65 84 76 65 66
>>char(a+32)
ans=
matlab
  • 字符串的比较
    • 关系运算符:两个字符串的每个字符依次按ASCII值大小逐个进行比较,比较的结果是一个数值向量,向量中的元素要么是1,要么是0
    • 字符串比较函数
      • strcmp(s1,s2):用来比较字符串s1和s2是否相等,相等返回1,否则0
      • strncmp(s1,s2,n):用来比较两个字符串前n个字符是否相等,相等返回1,否则0
      • strcmpi(s1,s2):在忽略字母大小写前提下来比较字符串s1和s2是否相等,相等返回1,否则0
      • strncmpi(s1,s2,n):在忽略字母大小写前提下比较两个字符串前n个字符是否相等,相等返回1,否则0
  • 字符串的查找与替换
    • findstr(s1,s2):返回段字符串在长字符串中的开始位置
    • strrep(s1,s2,s3):将字符串s1中的所有字符串s2替换成字符串s3
1
2
3
4
5
6
7
8
9
>>p=findstr('This is test!','is')
p=
3 6
>>>p=findstr('is','This is test!')
p=
3 6
>>result=strrep('This is a test!','text','class')
result=
This is a class

特殊矩阵(调用方式相似)

  • zreos函数:产生全0矩阵,即零矩阵

    • zero(m):产生m×m零矩阵

    • zeros(m,n):产生m×n零矩阵

    • zero(size(A)):产生与矩阵A同样大小的零矩阵

      1
      2
      3
      4
      5
      6
      7
      8
      9
      >>A=zeros(2,3)
      A=
      0 0 0
      0 0 0
      >>zeros(size(reshape(A,3,2))) //把矩阵A变为三行两列的矩阵并产生和改变后的矩阵A相同的大小的零矩阵
      ans=
      0 0
      0 0
      0 0
  • ones函数:产生全1矩阵,即幺矩阵

  • eye函数:产生对角线为1的矩阵,当矩阵是方阵时,得到一个单位矩阵

  • rand函数:产生(0,1)区间均匀分布的随机矩阵

  • randn函数:产生均值为0,方差为1的标准正太分布随机矩阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//首先产生5阶两位随机整数矩阵A,再产生均值为0.6,方差为0.15阶正太分布矩阵B,最后验证(A+B)I=IA+BI(I为单位矩阵)
//rand函数:产生(01)区间均匀分布的随机数
//fix(a+(b-a+1)*x):产生[a,b]区间上均匀分布的随机整数
//rand函数:产生均值为0,方差为1的标准正太分布随机矩阵
//μ+σx:得到均值为μ,方差为σ^2的随机数
>>A=fix(10+(99-10+1)*rand(5)); //产生55列的矩阵其值时1099之间的矩阵A
>>B=0.6+sqrt(0.1)*randn(5); //产生均值为0.6方差为0.155列的正态分布随机矩阵矩阵B
>>C=eye(5); //产生5阶单位阵
>>(A+B)*C==C*A+B*C
ans=
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

用于专门学科的特殊矩阵

  • 魔方矩阵
    • n阶魔方阵由1,2,3……n2共n2个整数组成,且每行,每列以及主副对角线上各n个元素之和都相等
    • n阶魔方阵每行每列元素的和为(1+2+3+……+n2)/n=(n+n3)/2
    • MATLAB函数magic(n)产生一个特定的魔方阵
1
2
3
4
5
6
7
8
9
//产生8阶魔方阵,求其每行每列元素的和
>>M=magic(8);
>>sum(M(1,:));

ans=
260
>>sum(M(:,1))
ans=
260
  • 范德蒙矩阵

  • 希尔伯特矩阵

矩阵变换

  • 对角阵

    • 对角矩阵:只有对角线上有非零元素的矩阵

    • 数量矩阵:对角线上的元素相等的对角矩阵

    • 单位矩阵:对角线上的元素都为1的矩阵

      • 提取矩阵的对角线元素
      • 规定与主对角线平行向上为第1条对角线,向下为第-1条,主对角线为第0条对角线
      • diag(A):提取矩阵A主对角线元素,产生一个列向量

      • diag(A,k):提取矩阵A第k条对角线的元素,产生一个列向量

      • 构造对角矩阵
      • diag(V):以向量V为主对角线元素,产生对角矩阵

      • diag(V,k):以向量V为第k条对角线元素,产生对角矩阵

      • ```matlab //先建立5×5矩阵A,然后将A的第一行元素乘以1,第二行元素乘以2……,第五行乘以5 //方法:提取一个列向量,元素为1,2,3……5,接着让这个列向量的第一行的第一个元素乘以A的第一行,第二行第二个元素乘以A的第二行…………即让这个列向量左乘矩阵A >>A=[7,0,1,0,5;3,5,7,4,1;4,0,3,0,2;1,1,9,2,3;1,8,5,2,9] A= 7 0 1 0 5 3 5 7 4 1 4 0 3 0 2 1 1 9 2 3 1 8 5 2 9 >>D=diag(1;5) >>D*A ans= 7 0 1 0 5 6 10 14 8 2 12 0 9 0 6 4 4 36 8 12 5 40 25 10 45

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18

        - ```matlab
        //要将A的各列元素分别乘以对角阵的对角线元素,如何实现? 右乘矩阵
        >>A=[7,0,1,0,5;3,5,7,4,1;4,0,3,0,2;1,1,9,2,3;1,8,5,2,9]
        A=
        7 0 1 0 5
        3 5 7 4 1
        4 0 3 0 2
        1 1 9 2 3
        1 8 5 2 9
        >>D=diag(1:5);
        >>A*D
        ans=
        7 0 3 0 25
        3 10 21 16 5
        4 0 9 0 10
        1 2 27 8 15
        1 16 15 8 45

  • 三角阵

    • 上三角矩阵

      • triu(A):提取矩阵A的主对角线以及以上元素

      • triu(A,k):提取矩阵A的第k条对角线及以上的元素

      • ```matlab >>triu(ones(4),-1) ans= 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 1

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38

        - 下三角矩阵

        - tril函数和triu用法一样

        ### 矩阵转置

        - 转置运算符是小数点后面接单引号(.')
        - 共轭转置,其运算符是单引号('),它在转置的基础上还要取每个数的复共轭
        - ![](https://cdn.staticaly.com/gh/pipi1002/markdown_pic@main/Screenshot_20230729_174731.jpg)

        ### 矩阵的旋转和旋转(上下翻转后主副对角线互换)

        ![](https://cdn.staticaly.com/gh/pipi1002/markdown_pic@main/Screenshot_20230729_174757.jpg)

        ![](https://cdn.staticaly.com/gh/pipi1002/markdown_pic@main/Screenshot_20230729_174844.jpg)

        ![](https://cdn.staticaly.com/gh/pipi1002/markdown_pic@main/Screenshot_20230729_175149.jpg)

        ### 矩阵求逆(inv函数)

        ![](https://cdn.staticaly.com/gh/pipi1002/markdown_pic@main/qq_pic_merged_1690624552843.jpg)

        ```matlab
        >>A=[1,2,3;1,4,9;1,8,27];
        >>b=[5;-2;6];
        >>x=inv(A)*b
        x=
        23.0000
        -14.5000
        3.6667

        //也可以用左除运算符
        >>x=A\b
        x=
        23.0000
        -14.5000
        3.6667