「matlab学习笔记」MATLAB基础知识

中国大学MOOC 科学计算与MATLAB语言(点击此处跳转)

MATLAB官方文档(点击此处跳转)

1.1 MATLAB系统环境

如何设置当前文件夹

  • 在“当前文件夹工具栏”或“当前文件夹窗口”中选择某文件夹为当前文件夹。
  • 使用cd命令。例如>> cd e:\work

注意:一定要先建立文件夹,再将这个文件夹设为当前文件夹。


image

如何设置文件搜索路径

  • 用 path 命令设置文件搜素路径。例如>> path(path,'e:\work')
  • 用对话框设置文件搜索路径。

image

1.2 MATLAB数值数据

MATLAB数值数据的类型大致可以分为 3 种,分别为整型、浮点型、复型。

整型

  • 按照有无符号可以分为无符号整数和带符号整数。
  • 按照数据范围可以分为8位、16位、32位和64位整数。
>> x=int8(129) %带符号8位整型数据的最大值是127
x =
  127
>> x=uint8(129) %无符号8位整型数据的最大值是255
x =
  129

注意:
1.MATLAB 默认情况下以双精度浮点形式 (double) 存储数值数据。
2.如果要转换为整数的数值带有小数部分或者超出了数据范围,映射到最近的端点
3.同时涉及整数和浮点数的算术运算始终生成整数数据类型。
4.MATLAB整型转换函数(以带符号8位整数为例)为 int8,切记不是 int!!!

浮点型

  • single函数:将其他类型的数据转换为单精度型。
  • double函数:将其他类型的数据转换为双精度型。
>> class(4) %class 为 MATLAB类型判断函数
ans =
    double  %MATLAB 默认情况下以双精度浮点形式 (double) 存储数值数据
>> class(single(4))
ans =
    single

复型

复型数据包括实部和虚部两个部分,实部和虚部默认为双精度型,虚数单位用 i 或 j 来表示。

  • real函数:求复数的实部。
  • imag函数:求复数的虚部。
>> 6+5i
ans =
    6.0000 + 5.0000i
>> 6+5j
ans =
    6.0000 + 5.0000i

数值数据的输出格式

format命令的格式format 格式符

>> format long
>> 50/3
ans =
    16.666666666666668
>> format
>> 50/3
ans =
    16.6667

注意:format命令只影响数据输出格式,而不影响数据的计算和存储。

常用数学函数

函数的调用格式为函数名(函数自变量的值)

函数在运算时是将函数逐项作用于矩阵的每个元素上,所以最后运算的结果就是一个与自变量同型的矩阵

指数函数

>> A=[4,2;3,6]
A =
  4 2
  3 6
>> B=exp(A)
B =
  54.5982 7.3891
  20.0855 403.4288

三角函数
三角函数有以弧度为单位的函数和以角度为单位的函数,如果是以角度为单位的函数就在函数名后面加“d”,以示区别。

>> sin(pi/2)
ans =
    1
>> sind(90)
ans =
    1

abs函数
abs函数可以求实数的绝对值、复数的模、字符串的ASCII码值。

>> abs(-4)
ans =
    4
>> abs(3+4i)
ans =
    5
>> abs('a')
ans =
    97

取整函数

  • round函数:按照四舍五入的规则来取整。
  • floor函数:向上取整,取大于等于这个数的第一个整数。
  • ceil函数:向下取整,取小于等于这个数的第一个整数。
  • fix函数:固定取靠近 0 的那个整数,也就是舍去小数取整。
>> round(4.7)
ans =
    5
>> fix(-3.2)
ans =
    -3
>> floor(3.6)
ans =
    3
>> ceil(-3.8)
ans =
    -3

取余函数
rem(a,b) 和 mod(a,b) 都返回 a 除以 b 的余数,两者的联系和区别如下:

  • 当 a 和 b 的符号一致时,两个函数结果相同;
  • 当 a 和 b 的符号不同时,rem函数结果的符号和被除数 a 一致,而mod函数和除数 b 一致。

\(rem(a, b) = a - b .* fix(a./b)\)

\(mod(a, b) = a - b .* floor(a./b)\)

注意:
1.rem函数遵从 rem(a,0) 是 NaN 的约定
2.mod函数遵从 mod(a,0) 返回 a 的约定
C语言中的%与rem一致,整除/的结果与%配套
Python中整除//的结果是不大于算术运算结果的最大整数(操作数可为浮点数)

%分别求一个三位正整数的个位数字、十位数字和百位数字。
>> m=345;
>> m1=rem(m,10)
m1 =
   5
>> m2=rem(fix(m/10),10)
m2 =
   4
>> m3=fix(m/100)
m3 =
   3

质数/素数
find函数详细用法(点击跳转官方文档)

%求[1,100]区间的所有素数
>> x=1:100;
>> k=isprime(x); %返回与 X 大小相同的逻辑数组。如果x(i) 为质数,则 k(i) 的值为 true;否则,值为 false。
>> k1=find(k);   %返回非零元素的索引
>> p=x(k1)
p =
  1 至 13 列
  2 3 5 7 11 13 17 19 23 29 31 37 41
  14 至 25 列
  43 47 53 59 61 67 71 73 79 83 89 97

1.3 变量及其操作

1.在MATLAB中,变量名是以字母开头 (区别于C语言的标识符),后接字母、数字或下画线的字符序列,最多63个字符
2.变量名区分字母的大小写。
3.标准函数名以及命令名一般用小写字母。

预定义变量

预定义变量是在MATLAB工作空间中驻留,由系统本身定义的变量。

ans 是默认赋值变量
i 和 j 代表虚数单位
pi 代表圆周率
NaN 代表非数

变量的管理

who命令与whos命令

image

内存变量文件
用于保存MATLAB工作区变量的文件叫做内存变量文件,其扩展名为.mat,也叫MAT文件。

  • save命令:创建内存变量文件。
  • load命令:装入内存变量文件。
>> save mydata a x %将变量 a 和 x 存入 mydata.mat 文件
>> load mydata %将 mydata.mat 文件中的所有变量加载至工作区。

1.4 MATLAB矩阵的表示

矩阵的建立

%利用直接输入法建立矩阵
>> A=[1,2,3;4,5,6;7,8,9]
A =
  1 2 3
  4 5 6
  7 8 9

%利用已建好的矩阵建立更大的矩阵
>> 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

%可以用实部矩阵和虚部矩阵构成复数矩阵
>>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

冒号表达式

\[e1:e2:e3 \]

其中,e1 表示初始值,e2 表示步长,e3 表示终止值。

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

省略步长 e2,则步长为 1。例如,t=0:5 与 t=0:1:5 等价。


\[linspace(a,b,n) \]

其中,a 表示第一个元素,b 表示最后一个元素,n 表示元素总数

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

当 n 省略时,自动产生 100 个元素。

结构矩阵和单元矩阵

结构矩阵
由结构数据构成的矩阵就是结构矩阵,结构矩阵里的每个元素就是结构数据类型。
建立结构矩阵的格式为结构矩阵元素.成员名=表达式

>> 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=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 =
  [10] 'liu'  [2x2 double]
  [12] 'wang' [2x2 double]
  [14] 'cai'  [2x2 double]

1.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

注意:
1.如果给出的行下标或列下标大于原来矩阵的行数和列数,那么MATLAB将自动扩展原来的矩阵,并将扩展后没有赋值的矩阵元素置为0。
2.引用元素和建立结构矩阵时,会自动扩展,但建立一般矩阵或单元矩阵时,还要遵循串联数组的维数一致性。
3.结构矩阵不同元素的相同成员可以不是一种数据类型,但是单元矩阵对应位置的元素必须是同一种数据类型。


通过序号来引用

  • 在MATLAB中,矩阵元素按列存储,即首先存储矩阵的第一列元素,然后存储第二列元素,…,一直到矩阵的最后一列元素。
  • 矩阵元素的序号就是矩阵元素在内存中的排列顺序。
>> A=[1,2,3;4,5,6]
A =
1 2 3
4 5 6
>> A(3)
ans =
    2

序号与下标是一一对应的,以 \(m×n\) 矩阵 \(A\) 为例,矩阵元素 \(A(i,j)\) 的序号为 \((j-1)×m+i\)

sub2ind函数:将矩阵中指定元素的行、列下标转换成存储的序号。
调用格式为

\[D=sub2ind(S,I,J) \]

其中,D 表示序号,S 表示行数和列数组成的向量,I 表示转换矩阵的行下标,J 表示转换矩阵的列下标。

>> A=[1:3;4:6]
A =
  1 2 3
  4 5 6
>> D=sub2ind(size(A),[1,2;2,2],[1,1;3,2]) %size函数可以获取指定矩阵行数和列数组成的行向量
D =
  1 2
  6 4

ind2sub函数:将把矩阵元素的序号转换成对应的下标。
调用格式为

\[[I,J]=ind2sub(S,D) \]

其中,I 表示行下标,J 表示列下标,S 表示行数和列数组成的向量,D 表示序号。

>> [I,J]=ind2sub([3,3],[1,3,5])
I =
  1 3 2
J =
  1 1 2

利用冒号表达式获得子矩阵

子矩阵是指由矩阵中的一部分元素构成的矩阵。

, 为行列下标的分界
: 表示行/列的全部元素
x:y 表示第 x~y 行/列

子矩阵 解释
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行的全部元素
>> 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)
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,:)
ans =
    16 17 18 19 20
>> A([1,4],3:end)
ans =
     3  4  5
    18 19 20

利用空矩阵删除矩阵的元素

空矩阵是指没有任何元素的矩阵

%x是一个空矩阵
>> x=[]
x =
  []

%利用空矩阵删除矩阵的元素
>> A=[1,2,3,0,0;7,0,9,2,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):在矩阵总元素保持不变的前提下,将矩阵A重
新排成m×n的二维矩阵。

注意:reshape函数只是改变原矩阵的行数和列数,但并不改变原矩阵元素个数及其存储顺序。

>> x=[23,45,65,34,65,34,98,45,78,65,43,76];
>> y=reshape(x,3,4)
y =
  23 34 98 65
  45 65 45 43
  65 34 78 76

A(:)表示将矩阵A的每一列元素堆叠起来,成为一个列向量,即等价于reshape(A,6,1)。

>> A =[-45,65,71;27,35,91]
A =
-45 65 71
27 35 91
>> B=A(:)
B =
  -45
   27
   65
   35
   71
   91

1.6 MATLAB基本运算

1.MATLAB的算术运算是在矩阵意义下进行的。
2.单个数据的算术运算只是矩阵运算的一种特例。
3.MATLAB的算术运算包括基本算数运算和点运算。
4.当矩阵的行数和列数均为1时,建立的矩阵叫做标量。

基本算数运算

基本算术运算符:+(加)、-(减)、*(乘)、/(右除)、(左除)、^(乘方)。

加减运算

  • 若两矩阵同型,则运算时两矩阵的相应元素相加减。
  • 若两矩阵不同型,则MATLAB将给出错误信息。
  • 一个标量也可以和矩阵进行加减运算,这时把标量和矩阵的每一个元素进行加减运算。

乘法运算

  • 矩阵A和B进行乘法运算,要求A的列数与B的行数相等,此时则称A、B矩阵是可乘的,或称A和B两矩阵维数和大小相容。
  • 如果两者的维数或大小不相容,则将给出错误信息,提示用户两个矩阵是不可乘的。

除法运算

  • 在MATLAB中,有两种矩阵除法运算:右除/和左除\。
  • 如果 A 矩阵是非奇异方阵,则 B/A 等效于 \(B * inv(A)\),A\B 等效于 \(inv(A) * B\)

注意:
1.右除/ 右边高,左除\ 左边高;在除号下方的矩阵等效时取逆,左右位置不变。
2.一般 B/A 不等于 A\B,但当其中一个矩阵为标量时,B/A 等于 A\B。


乘方运算
一个矩阵的乘方运算可以表示成A^x,要求A为方阵,x为标量

>> A=[1,2,3;4,5,6;7,8,0];
>> A^2
ans =
    30 36 15
    66 81 42
    39 54 69

点运算

点运算符:.*、./、.\和.^。

两矩阵进行点运算是指它们的对应元素进行相关运算,要求两矩阵同型

>> 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.4、0.7、1时,分别求y=sin x cos x的值
>> x=0.1:0.3:1;
>> y=sin(x).*cos(x);

关系运算

关系运算符:<(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、==(等于)、~=(不等于)。

  • 当两个比较量是标量时,直接比较两数的大小。若关系成立,关系表达式结果为1,否则为0。
  • 当参与比较的量是两个同型的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,最终的关系运算的结果是一个与原矩阵同型的矩阵,它的元素由0或1组成。
  • 当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运算规则逐个比较,最终的关系运算的结果是一个与原矩阵同型的矩阵,它的元素由0或1组成。
%建立3阶方阵A,判断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

逻辑运算

逻辑运算符:&(与)、|(或)和~(非)。

  • 若参与逻辑运算的是两个同型矩阵,那么将对矩阵相同位置上的元素按标量规则逐个进行运算,最终运算结果是一个与原矩阵同型的矩阵,其元素由1或0组成。
  • 若参与逻辑运算的一个是标量,一个是矩阵,那么将在标量与矩阵中的每个元素之间按标量规则逐个进行运算,最终运算结果是一个与矩阵同型的矩阵,其元素由1或0组成。
逻辑运算 运算规则
a&b a、b全为非零时,运算结果为1,否则为0
a|b a、b中只要有一个为非零时,运算结果为1
~a 当a为零时,运算结果为1;当a为非零时,运算结果为0
>> 3<4 & 6>5
ans =
    1
>> ~(9==1)
ans =
    1
>> ~9==1
ans =
    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

1.7 字符串处理

字符串的表示

在MATLAB中,字符串是用单引号括起来的字符序列。

>> 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

将字符串倒过来重新排列。

>> ch='ABc123d4e56Fg9';
>> revch=ch(end:-1:1) %初始值为 end,步长为 -1,终止值为 1
revch =
      '9gF65e4d321cBA'

将字符串中的小写字母变成相应的大写字母,其余字符不变。

>> k=find(ch>='a'&ch<='z')
k =
  3 7 9 13
>> ch(k)=ch(k)-('a'-'A')
ch =
   'ABC123D4E56FG9'

统计字符串中小写字母的个数。

length函数作用于矩阵,则返回矩阵中列向量的个数;若作用于字符串,则返回字符串中字符的个数。

>> length(k)
ans =
    4

字符串的操作

字符串的执行
格式为eval(s)

>> t=pi;
>> m='[t,sin(t),cos(t)]';
>> y=eval(m)
y =
  3.1416 0.0000 -1.0000

字符串与数值之间的转换

  • abs和double函数都可以用来获取字符串矩阵所对应的ASCII码数值矩阵。
  • char函数可以把ASCII码矩阵转换为字符串矩阵。
>> s1='MATLAB';
>> a=abs(s1)
a =
  77 65 84 76 65 66
>> char(a+32)
ans =
    'matlab'

字符串的比较

字符串的比较有两种方法:利用关系运算符或字符串比较函数。

关系运算符比较:两个字符串里的每个字符依次按ASCII值大小逐个进行比较,比较的结果是一个数值向量,向量中的元素要么是1,要么是0。

>> 'www0'>='W123'
ans =
    1 1 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
>> strcmp('www0', 'w123')
ans =
    0
>> strncmpi('Www0','w123',1)
ans =
    1

字符串的查找与替换

  • 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!'

MATLAB常用指令小结

MATLAB常用指令 功能
clear 清空工作区变量
clc 清空命令行窗口

友链

详细版笔记请跳转爆豆的博客

【Matlab学习1.1】操作界面、搜索路径

【Matlab学习1.2】数值数据

【Matlab学习1.3】变量及其操作

【Matlab学习1.4】矩阵的表示

【Matlab学习1.5】矩阵元素的引用

【Matlab学习1.6】矩阵元素的引用

【Matlab学习1.7】字符串处理

posted @ 2023-01-28 21:54  恺雯  阅读(386)  评论(0编辑  收藏  举报