【例2.1】使用“from:
step:
to”方式生成以下矩阵。
x1=2:
5
x1=
2345
x2=2:
0.5:
4
x2=
2.00002.50003.00003.50004.0000
x3=5:
-1:
2
x3=
5432
x4=2:
-1:
3%空矩阵
x4=
Emptymatrix:
1-by-0
x5=2:
-1:
0.5
x5=
21
x6=[1:
2:
5;1:
3:
7]%两行向量构成矩阵
x6=
135
147
(2)使用linspace和logspace函数生成向量
linspace(a,b,n)
说明:
a、b、n三个参数分别表示开始值、结束值和元素个数。
生成从a到b之间线性分布的n个元素的行向量,n如果省略则默认值为100。
▪logspace用来生成对数等分向量,它和linspace一样直接给出元素的个数而得出各个元素的值。
logspace(a,b,n)
说明:
a、b、n三个参数分别表示开始值、结束值和数据个数,n如果省略则默认值为50。
生成从10a到10b之间按对数等分的n个元素的行向量。
【例2.2】用linspace和logspace函数生成行向量。
x1=linspace(0,2*pi,5)%从0到2*pi等分成5个点
x1=
01.57083.14164.71246.2832
x2=logspace(0,2,3)%从1到100对数等分成3个点
x2=
110100
3.由矩阵生成函数产生特殊矩阵
MATLAB提供了很多能够产生特殊矩阵的函数,各函数的功能如表2.2所示。
表2.2矩阵生成函数
函数名
功能
例子
输入
结果
zeros(m,n)
产生m×n的全0矩阵
zeros(2,3)
ans=
000
000
ones(m,n)
产生m×n的全1矩阵
ones(2,3)
ans=
111
111
rand(m,n)
产生均匀分布的随机矩阵,元素取值范围0.0~1.0。
rand(2,3)
ans=
0.95010.60680.8913
0.23110.48600.7621
randn(m,n)
产生正态分布的随机矩阵
randn(2,3)
ans=
-0.43260.1253-1.1465
-1.66560.28771.1909
magic(N)
产生N阶魔方矩阵(矩阵的行、列和对角线上元素的和相等)
magic(3)
ans=
816
357
492
eye(m,n)
产生m×n的单位矩阵
eye(3)
ans=
100
010
001
注意:
zeros、ones、rand、randn和eye函数当只有一个参数n时,则为n×n的方阵;
当eye(m,n)函数的m和n参数不相等时则单位矩阵会出现全0行或列。
【例2.3】查看eye函数的功能。
X1=eye(2,3)
X1=
100
010
X2=eye(3,2)
X2=
10
01
00
4.通过MAT数据文件加载矩阵
通过“load”命令或选择菜单“File”→“ImportData”命令加载MAT数据文件来创建矩阵。
5.在M文件中创建矩阵
M文件实际上是一种包含MATLAB代码的文本文件;
通过在MATLAB命令窗口中运行M文件创建矩阵。
2.2.2矩阵元素和操作
矩阵和多维数组都是由多个元素组成的,每个元素通过下标来标识。
1.矩阵的下标
(1)全下标方式
矩阵中的元素可以用全下标方式标识,即由行下标和列下标表示,一个m×n的a矩阵的第i行第j列的元素表示为a(i,j)。
注意:
●如果在提取矩阵元素值时,矩阵元素的下标行或列(i,j)大于矩阵的大小(m,n),则MATLAB会提示出错;
●而在给矩阵元素赋值时,如果行或列(i,j)超出矩阵的大小(m,n),则MATLAB自动扩充矩阵,扩充部分以0填充。
a=[12;34;56]
a=
12
34
56
a(3,3)%提取a(3,3)的值
?
?
?
Indexexceedsmatrixdimensions.
a(3,3)=9%给a(3,3)赋值
a=
120
340
569
(2)单下标方式
先把矩阵的所有列按先左后右的次序连接成“一维长列”,然后对元素位置进行编号。
以m×n的矩阵a为例,若元素a(i,j)则对应的“单下标”为s=(i-1)×m+j。
2.子矩阵块的产生
子矩阵是从对应矩阵中取出一部分元素构成,用全下标和单下标方式取子矩阵。
(1)用全下标方式
矩阵a为图2.2所示,则:
▪取行数为1、3,列数为2、3的元素构成子矩阵。
a([13],[23])
ans=
20
69
▪取行数为1~3,列数为2~3的元素构成子矩阵,“1:
3”表示1、2、3行下标。
a(1:
3,2:
3)
ans=
20
40
69
▪取所有行数即为1~3,列数为3的元素构成子矩阵,“:
”表示所有行或列。
a(:
3)
ans=
0
0
9
▪取行数为1~3,列数为3的元素构成子矩阵,用“end”表示某一维数中的最大值,即3。
a(1:
3,end)
ans=
0
0
9
(2)用单下标方式
取单下标为1、3、2、6的元素构成子矩阵。
a([13;26])
ans=
15
36
(3)逻辑矩阵
子矩阵也可以利用逻辑矩阵来标识;
逻辑矩阵是大小和对应矩阵相同,而元素值为0或者1的矩阵。
可以用a(L1,L2)来表示子矩阵,其中L1、L2为逻辑向量,当L1、L2的元素为0则不取该位置元素,反之则取该位置的元素。
【例2.5】利用逻辑矩阵来提取矩阵,其中矩阵a如上图2.2所示。
l1=logical([101])%给出逻辑向量l1
l1=
101
l2=logical([110])%给出逻辑向量l2
l2=
110
a(l1,l2)%取出1、3行且1、2列的元素
ans=
12
56
【例2.5续】逻辑矩阵可以由矩阵进行逻辑运算得出。
b=a>1%得出逻辑向量b
b=
010
110
111
a(b)%按单下标顺序排成长列
ans=
3
5
2
4
6
9
3.矩阵的赋值
▪全下标方式:
a(i,j)=b,给a矩阵的部分元素赋值则b矩阵的行列数必须等于a矩阵的行列数。
cleara
a(1:
2,1:
3)=[111;111]%给第一、二行元素赋值为全1
a=
111
111
▪单下标方式:
a(s)=b,b为向量,元素个数必须等于a矩阵的元素个数。
a(5:
6)=[23]%给第5、6元素赋值
a=
112
113
▪全元素方式:
a(:
)=b,给a矩阵的所有元素赋值则b矩阵的元素总数必须等于a矩阵的元素总数,但行列数不一定相等。
a=[12;34;56]
a=
12
34
56
b=[123;456]
b=
123
456
a(:
)=b%按单下标方式给a赋值
a=
15
43
26
4.矩阵元素的删除
删除操作就是简单地将其赋值为空矩阵(用[]表示)。
a=[120;340;569]
a=
120
340
569
a(:
3)=[]%删除一列元素
a=
12
34
56
a
(1)=[]%删除一个元素,则矩阵变为行向量
a=
35246
a=[]%删除所有元素为空矩阵
a=
[]
5.生成大矩阵
在MATLAB中,可以通过方括号“[]”实现将小矩阵联接起来生成一个较大的矩阵。
a=[120;340;569]
a=
120
340
569
[a;a]%联接成6×3的矩阵
ans=
120
340
569
120
340
569
a=[120;340;569]
[aa]%联接成3×6的矩阵
ans=
120120
340340
569569
a=[120;340;569]
[a(1:
2,1:
2)10*a(1:
2,2:
3)]%计算并联接
ans=
12200
34400
6.矩阵的翻转
a=
120
340
569
表2.3常用矩阵翻转函数
函数名
功能
例子
输入
结果
triu(X)
产生X矩阵的上三角矩阵,其余元素补0。
triu(a)
ans=
120
040
009
tril(X)
产生X矩阵的下三角矩阵,其余元素补0。
tril(a)
ans=
100
340
569
flipud(X)
使矩阵X沿水平轴上下翻转
flipud(a)
ans=
569
340
120
fliplr(X)
使矩阵X沿垂直轴左右翻转
fliplr(a)
ans=
021
043
965
flipdim(X,dim)
使矩阵X沿特定轴翻转。
dim=1,按行维翻转;
dim=2,按列维翻转。
flipdim(a,1)
ans=
569
340
120
rot90(X)
使矩阵X逆时针旋转900
rot90(a)
ans=
009
246
135
2.2.3字符串
在MATLAB中,字符串是作为字符数组来引入的;
一个字符串由多个字符组成,用单引号(’’)来界定;
字符串是按行向量进行存储的,每一字符(包括空格)是以其ASCII码的形式存放。
clear
str1='Hello'
str1=
Hello
str2='Ilike''MATLAB'''%重复单引号来输入含有单引号的字符串
str2=
Ilike'MATLAB'
str3='你好!
'%支持中文
str3=
你好!
1.字符串占用的字节
whos
NameSizeBytesClass
str11x510chararray
str21x1530chararray
str31x36chararray
Grandtotalis23elementsusing46bytes
2.字符串函数
▪length:
用来计算字符串的长度(即组成字符的个数)。
▪double:
用来查看字符串的ASCII码储存内容,包括空格(ASCII码为32)。
▪char:
用来将ASCII码转换成字符串形式。
▪class或ischar:
用来判断某一个变量是否为字符串。
class函数返回char则表示为字符串,而ischar函数返回1表示为字符串。
▪strcmp(x,y):
比较字符串x和y的内容是否相同。
返回值如果为1则相同,为0则不同。
▪findstr(x,x1):
寻找在某个长字符串x中的子字符串x1,返回其起始位置。
▪deblank(x):
删除字符串尾部的空格。
由于MATLAB将字符串以其相对应的ASCII码储存成一个行向量,因此如果字符串直接进行数值运算,则其结果就变成一般数值向量的运算,而不再是字符串的运算。
length(str1)%字符串长度
ans=
5
x1=double(str1)%查看字符串的ASCII码
x1=
72101108108111
x2=str1+1%字符串的数值运算
x2=
73102109109112
char(x1)%将ASCII码转换成字符串形式
ans=
Hello
char(x2)
ans=
Ifmmp
class(str1)%判断变量类型
ans=
char
class(x1)
ans=
double
ischar(str1)
ans=
1
3.使用一个变量来储存多个字符串
(1)多个字符串组成一个新的行向量
将多个字符串变量直接用“,”连接,构成一个行向量,就可以得到一个新字符串变量。
clear
str1='Hello';
str2='Ilike''MATLAB''';
str3='你好!
'
str4=[str1,'!
',str2]%多个字符串并排成一个行向量
str4=
Hello!
Ilike'MATLAB'
(2)使用二维字符数组
将每个字符串放在一行,多个字符串可以构成一个二维字符数组,但必须先在短字符串结尾补上空格符,以确保每个字符串(即每一行)的长度一样。
否则MATLAB会提示出错:
str5=[str1;str3]
?
?
?
Errorusing==>vertcat
Allrowsinthebracketedexpressionmusthavethesame
numberofcolumns.
str5=[str1;str3,'']%将str3添加两个空格
str5=
Hello
你好!
(3)使用str2mat、strvcat和char函数
使用专门的str2mat、strvcat和char函数可以构造出字符串矩阵,而不必考虑每行的字符数是否相等,总是按最长的设置,不足的末尾用空格补齐。
str6=str2mat(str1,str2,str3)
str6=
Hello
Ilike'MATLAB'
你好!
str7=char(str1,str2,str3)
str7=
Hello
Ilike'MATLAB'
你好!
str8=strvcat(str1,str2)
str8=
Hello
Ilike'MATLAB'
whos
NameSizeBytesClass
str11x510chararray
str21x1530chararray
str31x36chararray
str41x2244chararray
str52x520chararray
str63x1590chararray
str73x1590chararray
str82x1560chararray
Grandtotalis186elementsusing350bytes
5.执行字符串
如果需要直接“执行”某一字符串,可以使用eval命令,效果就如同直接在MATLAB命令窗口内输入此命令。
str9='a=2*5'
str9=
a=2*5
eval(str9)%执行字符串
a=
10
6.显示字符串
字符串可以直接使用disp命令显示出来,即使后面加分号(;)也显示。
disp('请输入2*2的矩阵a')
请输入2*2的矩阵a
disp(str1)
Hello
2.2.4矩阵和数组运算
矩阵运算有明确而严格的数学规则,矩阵运算规则是按照线性代数运算法则定义的;
数组运算是按数组的元素逐个进行的。
1.矩阵运算的函数
a=
123
456
789
表2.4常用矩阵运算函数
函数名
功能
例子
输入
结果
det(X)
计算方阵行列式
det(a)
ans=
0
rank(X)
求矩阵的秩,得出的行列式不为零的最大方阵边长。
rank(a)
ans=
2
inv(X)
求矩阵的逆阵,当方阵X的det(X)不等于零,逆阵X-1才存在。
X与X-1相乘为单位矩阵。
inv(a)
Warning:
Matrixisclosetosingularorbadlyscaled.
Resultsmaybeinaccurate.RCOND=1.541976e-018.
ans=
1.0e+016*
-0.45040.9007-0.4504
0.9007-1.80140.9007
-0.45040.9007-0.4504
[v,d]=eig(X)
计算矩阵特征值和特征向量。
如果方程Xv=vd存在非零解,则v为特征向量,d为特征值。
[v,d]=eig(a)
v=
-0.2320-0.78580.4082
-0.5253-0.0868-0.8165
-0.81870.61230.4082
d=
16.116800
0-1.11680
00-0.0000
diag(X)
产生X矩阵的对角阵
diag(a