第二讲 数组及矩阵运算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二讲
数组及矩阵运算
数值数组(矩阵)及其运算是MATLAB的核心。
它可以使计算程序简单、易读,使程序更接近于教科书上的数学计算公式,这也是理工科学生最需要的。
另外,它提高了程序的向量化程度,提高计算效率,节省计算
机的开销。
注意:矩阵与二维数组在形式上相同,但不同于数组,矩阵具有特定的含义和运算方式。
>>x1=[0,0.1,0.2,0.3,0.4,0.5]%简单的一维数组>>y1=x1.*exp(-x1)%数组的乘积运算>>x2=rand(1,4) %产生4个随机数,构成行向量>>x=[1 2 3; 4 5 6; 7 8 9]
%二维数组,也可认为是3行2列的矩阵x=
1 2 3
4 5 6
7 8 9
一、数值数组的创建
1. 一维数组的创建
逐个元素输入法
这是最简单又最通用的方法,用中括号[ ]表示,输入元素以空格或逗号为间隔。
函数生成法
利用MATLAB提供的特殊形式的数组/矩阵函数来生成。
特点:数组元素的大小按递增或递减的次序排列,元素之间的“差”是“等步长”的。
作用:用作函数的自变量,for循环中的循环自变量等。
1)“冒号:”生成法
x=a :inc :b
其中:inc 是采样点间隔,即步长,默认值为1。
递增/递减型一维数组的创建
2)线性或对数定点法
¾x=linspace(a,b,n) 线性等间隔为1×n行数组
其中:
a,b为左右端点,n为总采样点数,即一维数组的长度,它等价于x=a:(b-a)/(n-1):b
¾x=logspace(a,b,n) 对数等间隔为1×n行数组
例1:产生一个从0到10的数组,间隔为2 >>a=0:2:10
a=
0 2 4 6 8 10
>>b=linspace(0,10,6)
b=
0 2 4 6 8 10
例2:以对数等分隔
>>ak=logspace(0,1,5)
ak=
0 10 10^2 10^3 10^4
2. 二维数组的创建
小规模数组的直接输入法
•整个输入组必须以方括号[ ]为其首尾;•行与行之间必须用分号;或[Enter]键隔离;•数组元素间必须用逗号或空格分隔;
•若元素之间有复数,则元素间不能用空格;
中规模数组的数组编辑器创建法
数组创建之后,将其保存为Matrix.mat文件。
使用时,只要在指令窗中输入load Matrix.mat(可不加文件后缀名)或利用菜单导入数据即可。
中规模数组的M文件创建法
打开文件编辑器,输入数组,并保存此文件(如MyMatrix.m)。
那么以后使用时,只要在指令窗中直接输入指令MyMatrix,就可运行该文件,数组也会自动生成。
常用的标准数组生成函数
生成各种分布随机数组产生全0数组产生全1数组产生正态分布随机数组产生均匀分布随机数组产生魔方数组(对高维不适用)产生单位数组(对高维不适用)eye
产生对角数组(对高维不适用)diag
利用MATLAB 函数创建
%产生(2×3)的全1数组>>ones(2,3)
ans=
1 1 1
1 1 1
%产生(2×3)的正态随机阵>>randn(2,3)
ans=
-0.4326 0.1253 -1.1 465
-1.6656 0.2877 1.1909%产生(3×3)的单位数组>>D=eye(3),diag(D)
D=
1 0 0
0 1 0
0 0 1
ans= 1 1 1
%产生对角数组
>>diag(diag(D))
ans=
1 0 0
0 1 0
0 0 1
3. 二维数组的标识和寻访
数组是从1开始进行编址的,比如x(n)表示第n个元素。
)3(x )3:1(y
)8:2:3(y )7,2,5(y %提取数组的第三个元素
%提取数组从第一到第三个元素
%提取数组从第三开始加2计算,到第八个元素
%提取数组由(5,2,7)标明下标的数。
例如:
寻访,生成一维列数组(由0和1组成);
指定的一维数组,若s 是“行/列数组”,就是长度相同的行/列数组左向右的次序首尾相接而成单下标)
指A 的第c 列的全部元素A(:,c )指A 的第r 行上的全部元素A(r ,:)指A 的第r 行、第c 列的元素(双下标)A(r,c )中的例3.2-6)
二、矩阵及其运算
1.创建方法:
与二维数组的生成方法相同。
eye(n) %生成n维的单位矩阵
eye(m,n) %生成m×n维的单位矩阵
eye(size(A)) %生成与A同维的单位矩阵例如:>>A=[1,2,3;4,5,6;7,8,9]
>>size(A) %显示矩阵A的大小(3行、3列)
>>eye(size(A))
ans=1 0 0
0 1 0
0 0 1
>>diag(1,2,3) %生成3阶对角阵,对角线
元素为1,2,3
⎟⎟⎟⎠
⎞⎜⎜⎜⎝⎛300020001例:4阶赫尔伯特矩阵
⎟⎟⎟⎟⎟⎟⎟⎟⎟⎠
⎞716
15
1615141514131413121
2. 矩阵元素的引用
矩阵元素通过下标(行和列)来引用
用矩阵元素的序号来引用矩阵元素:序号就是相应元素在内存中的排列顺序。
在MATLAB 中,矩阵元素按列存储,先存第一列,再存第二列,依次类推。
例如:>>A=[1,2,3;4,5,6]
A(:)=[1 4 2 5 3 6] ' A(3)=2
A(1,2)=2
3
2
6
5
4
3
2
1
×
⎥
⎦
⎤
⎢
⎣
⎡
=
A
显然,序号Index与下标Subscript是一一对应的。
以m×n矩阵A为例,矩阵元素A(i,j)的序号为(j-1)*m+1,它们之间的相互转换也可以利用函数sub2ind和ind2sub求得。
例如:找出矩阵A中大于5的元素的位置。
A=magic(3)
si=find(A>5) %用序号(单下标)确定符合A>5的数位置[r1,c1]=ind2sub(size(A),si)%转换成双下标
[row,col]=find(A>5) %直接用双下标表示
3. 矩阵拆分
利用冒号表达式获得子矩阵
如:
A(i:i+m,:):表示矩阵A第i~i+m行的全部元素A(i:i+m,k:k+n):表示矩阵A第i~i+m行内,并
在第k~k+n列中的所有元素此外,还可以利用一般向量和end运算符来表示矩阵下标,从而获得子矩阵。
end表示某一维的末尾元素下标。
利用空矩阵删除矩阵的元素
在MATLAB中,定义[]为空矩阵。
如X=[]表示变量X被赋值为空矩阵。
注意:X=[ ]与clear X不同,clear表示将X从工作空间中删除,而空矩阵则存在工作空间中,只是维数为0,数据类型为double。
三、数组和矩阵运算
数组和矩阵运算见书本中表3.3-1所示。
要特
别注意的是数组运算符号中的小黑的“.”。
数组运算若在两个数组之间进行,那么它们的维数大小必须相同。
两矩阵相加或减时,两矩阵的维数也必须相同,否则MATLAB将给出错误信息,提示用户两个矩阵不匹配。
矩阵乘法
假定有两个矩阵A和B,若A为m×n矩阵,B为n×p矩阵,则C=A*B为m×p矩阵。
矩阵除法
分两种:左除\和右除/。
A\B等效于A的逆矩阵左乘B矩阵,即inv(A)*B;而B/A等效于B乘以A的逆矩阵,即B*inv(A)。
点运算符
就是在关系运算符前加上小黑点“.”。
矩阵的点运算(点积)是指对矩阵中的对应元素进行相关计算,这要求两矩阵的维数要相同。
矩阵的叉积是按照矩阵乘法的规则进行的。
例如:比较A*B和A.*B的区别。
A=[1 2 3; 4 5 6;7 8 9]B=ones(3,3) %生成全1矩阵c1=A.*B %点运算c2=A*B %矩阵相乘结果:
⎥⎥
⎥⎦
⎤
⎢⎢⎢⎣⎡=⎥⎥
⎥⎦⎤
⎢⎢⎢⎣⎡=24242415151566629876543211c c ⎥⎥⎥⎦⎤
⎢⎢⎢⎣
⎡=⎥⎥⎥⎦⎤
⎢⎢⎢⎣
⎡=24242415151566629876543211c c
¾执行数组运算的常用函数:
求共軛复数
conj
相位角(弧度)符号函数sign
绝对值或模
向最近整数求整round 平方根求余数
模除求余mod 向-∞取整函数floor 常用对数log10向0取整函数fix 自然对数log 向+∞取整函数ceil 指数exp help floor/doc floor 来查阅函数的具体使用情况。
¾
常用的矩阵函数
A 的逆矩阵A 的F 范数)A 的无穷范数A 的迹
A 的秩A 的1范数norm(A,1)A 的特征值eig(A )A 的行列式det(A )
[X,D]=eig(A )
其中:X为A的特征向量矩阵,D的对角线为A的特征值
例如:已知,求其特征值和特征向量。
⎥⎦
⎤
⎢⎣⎡−=0110A >>A=[0 1;-1 0]
>>[X,D]=eig(A)D=0+i
0-i ⎟⎟⎠⎞⎜⎜⎝
⎛−+=i i X 7071.007071.007071.07071.0
[R,ci ]=rref(A ) %得到A 的行阶梯型矩阵R 例如:>>A=[1,2,3;4,5,6;7,8,9]
>>R=rref(A)
>>r=rank(A) %求矩阵的秩
>>d=det(A) %求矩阵的行列式0
010001=
R 得到r=2
d=0
四、数组的基本操作
数组操作包括反转、插入、提取、收缩、重组等,目的是为了生成比较复杂等数组或对已生成进行修改。
铺放模块数组,以形成更大的数组
在总元素不变对情况下,改变数组的“行数、列数”
“水平中线”为对称轴,交换上下对称位置上的数组元素
“垂直中线”为对称轴,交换左右对称位置上的数组元素
把数组逆时针旋转90度
例如:
a=1:8 %产生(1×8)的一维数组A1=reshape(a,4,2) %把a重排成(4×2)的二维数组A2=reshape(A1,2,4)
b=diag(A2)
B=diag(b)
得到:
a=1 2 3 4 5 6 7 8
A1=1 5 A2= 1 3 5 7
2 6 2 4 6 8
3 7
4 8
b=1 B= 1 0
4 0 4
五、关系操作和逻辑操作
操作之后的输出结果是一个由0和1组成“逻辑数组”,其中1表示“真”,0表示“假”。
1. 关系操作
MATLAB提供了6种关系运算符:<(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、==(等于)、~=(不等于)。
其运算法则为:
1)当两个比较量是标量时,直接比较两数的大小。
若关系成立,关系表达式结果为1,否则为0。
2)当参与比较的量是两个维数相同的矩阵时,比较
是对两矩阵相同位置的元素按标量关系运算规则逐个进行。
最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成。
3)若是标量与矩阵相比较时,是将标量与矩阵中每
个元素逐个比较,结果是产生一个与原矩阵维数相同的矩阵。
例如:产生5阶随机方阵A,其元素为[10,90]区间的随机整数,然后判断A的元素是否能被3整除。
(1) 生成5阶随机方阵A。
A=fix((90-10+1)*rand(5)+10)
(2) 判断A的元素是否可以被3整除。
P=rem(A,3)==0
其中:rem(A,3)是矩阵A的每个元素除以3的余数矩阵。
此时,0被扩展为与A同维数的零矩阵,P是进行等于(==)比较的结果矩阵。
fix表示向0取整,如fix(15.668)=15
2. 逻辑运算
逻辑运算符有:
&(与)、|(或)、~(非)和xor(与非)。
其运算法则同关系运算相同。
注意:在算术、关系、逻辑运算中,算术运算优先级最高,逻辑运算优先级最低。
例如:建立矩阵A,并找出大于4的元素的位置。
1)建立矩阵A。
A=[4,-65,-54,0,6;56,0,67,-45,0]
A=[4 -65 -54 0 6;
56 0 67 -45 0]
2)找出大于4的元素的位置。
[r,c]=find(A>4) %r,c分别表示行列位置
r=2 2 1
c=1 3 5
1. “非数”数组
用来记述等运算产生的结果,以避免造成程序执行的中断。
在MATLAB中用NaN 它具有如下性质:
传递性,即NaN参与运算所得的结果也是NaN 不可比较,因为非数没有“大小”的概念
只能用isnan来判断是否为非数六、两种特殊的数组
∞×∞
∞000,,
2. “空”数组
只要数组某维的长度为0或若干维长度均为0,则该数组就是空数组。
通常二维“空”数组用[ ]表示。
用“空”数组可以对其他数组赋值时,可以使数组
变小,但不能改变数组维数。
空数组属于数值类,double型
空不等于虚无,它确实存在
只能用指令isempty判断
空数组与全零数组是两个不同的概念
例如:将数组进行收缩
%提取A 的1,3,5列
>> A=[1,2,3,4,5,6;7,8,9,10,11,12;13,14,15,16,17,18]; >> A1=A(:,[1,3,5])
>> A(:,[2,4,6])=[]%删除A的第2、4、6列
A1 = A=
1 3 5 1 3 5
7 9 11 7 9 11
13 15 17 13 15 17
七、向量化编程
所谓向量化编程,就是要尽量少地采用标量运算表达式,尽可能地使用数组/矩阵运算指令来代替原先那些“包含标量运算表达式的循环体”。
优点:执行速度快、可读性好、方便。
要求:编程者须熟悉数组运算和MATLAB 的指令。
1. 非向量化编程
clear
vr =[0.89, 1.20, 3.09, 4.27, 3.62, 7.71, 8.99, 7.92, 9.70, 10.41];
ir =[0.028,0.040,0.100,0.145,0.118,0.258,0.299,0.257,0.308,0.345];
L=length(vr ) %计算数组的长度
for k=1:L
r(k )=vr(k)/ir(k ); %根据各测量点计算电阻
end
sr =0;
for k=1:L
sr =sr+r(k ); %计算所有电阻之和
end
rm =sr /L %计算电阻平均值
例如:根据测得的一组电压、电流值计算平均电阻值。
2. 向量化编程
clear
vr=[0.89, 1.20, 3.09, 4.27, 3.62, 7.71, 8.99, 7.92, 9.70, 10.41];
ir=[0.028,0.040,0.100,0.145,0.118,0.258,0.299,0.257,0.308,0.345];
计算各测量点上的电阻值
) %计算电阻平均值
help/MATLAB/Mathematics/Matrics and Linear Algebra。