1.4 数组和矩阵运算
矩阵是MATLAB数据存储的基本单元,矩阵运算是MATLAB语言的核心,在MATLAB语言系统中几乎一切运算都是以对矩阵的操作为基础的。
1.4.1 数组的创建与运算
1.数组的创建
在MATLAB中,一般使用方括号(\[\])、逗号(,)、空格、冒号(:)、函数命令等方法来创建数组,具体方法见表1-8。
表1-8 数组的创建方法
命令
用途
x=\[a,b,c,d\]
创建包含指定元素的数组
x=first:last
创建从first开始,加1计数,到last结束的数组
(续)
命令
用途
x=first:increment:last
创建从first开始,加increment计数,以last结束的数组
x=linspace(first,last,n)
创建从first开始,到last结束,有n个元素的数组
x=logspace(first,last,n)
创建从first开始,到last结束,有n个元素的对数分隔数组
x=\[y,z,1,2,3\]
y和z为数组,拼接y、z数组并扩展为更大的数组
2.数组元素的访问
访问一个元素:x(i)表示访问数组x的第i个元素。
访问一块元素:x(s:h:t)表示访问数组x的从第s个元素开始,以步长h到第t个(但不超过t)的这些元素,h可以为负数,h缺省时为1。
直接使用元素编址序号:x(\[a,b,c,d\])表示提取数组x的第a、b、c、d个元素构成一个新的数组\[x(a) x(b) x(c) x(d)\]。
3.标量与数组的运算
标量与数组的加、减、乘、除、乘方运算是数组的每个元素与该标量进行相应的加、减、乘、除、乘方运算。表1-9给出了标量与数组的运算法则。
表1-9 标量与数组的运算法则
表达式及其运算结果
运算结果说明
a+c=\[a1+c,a2+c,…,an+c\]即数组a的每个元素加上c
a*c或a.*c=\[a1*c,a2*c,…,an*c\]即数组a的每个元素乘以c
a/c或a./c=\[a1/c,a2/c,…,an/c\]即数组a的每个元素除以c
a.c=\[c/a1,c/a2,…,c/an\]即c除以数组a的每个元素
a.c=\[a1c,a2c,…,anc\]即数组a的每个元素的c次幂
c.a=\[ca1,ca2,…,can\]即以c为底,以a的每个元素为指数的幂
其中a=\[a1,a2,…,an\]是数组,c为标量。
4.数组与数组的运算
数组与数组的运算要求数组维数是相同的,其加、减、乘、除、幂运算可按元素对元素方式进行,不同维数的数组不能进行运算,其运算法则见表1-10。
表1-10 数组与数组的运算法则
表达式及其运算结果
运算结果说明
a+b=\[a1+b1,a2+b2,…,an+bn\]即数组a与b的对应元素相加
a.*b=\[a1*b1,a2*b2,…,an*bn\]即数组a与b的对应元素相乘
a./b=\[a1/b1,a2/b2,…,an/bn\]即数组a与b的对应元素相除
a.b=\[b1/a1,b2/a2,…,bn/an\]即数组b与a的对应元素相除
a.b=\[a1b1,a2b2,…,anbn\]即数组a与b的对应元素的幂
dot(a,b)=a1*b1+a2*b2+…+an*bn即数组a与b的数量积或称向量内积
其中a=\[a1,a2,…,an\],b=\[b1,b2,…,bn\]。
注意:数组的乘除法是指两个同维数组对应元素之间的乘除法,它们的运算符只能为“.*”、“./”或“.”,而表达式a*b、a/b、ab是没有意义的。
1.4.2 矩阵的输入与运算
1.矩阵的输入
1)直接输入法。从键盘直接输入矩阵的每一个元素。具体方法如下:将矩阵的所有元素用方括号括起来,在方括号内按矩阵行的顺序输入各元素,同一行的各元素之间用空格或逗号分隔,不同行的元素之间用分号或回车键分隔。例如:
>>A=\[2,3,5;1,3,5;6,9,4\] %同一行元素之间用空格或逗号,行之间用分号或回车
A=
2 3 5
1 3 5
6 9 4
2)外部文件读入法。MATLAB语言允许用户调用在MATLAB环境之外定义的矩阵,可以利用任意文本编辑器所编辑的矩阵。矩阵元素之间以特定分断符分开,并按行列布置。load函数用于调用数据文件,其调用方法为:load+文件名\[参数\]。
例如:事先在记事本中编辑以下数据,保存为文件data1.txt,文件放在当前目录下。
1 1 1
1 2 3
1 3 6
在MATLAB命令行窗口中输入:
>> load data1.txt
>> data1%显示数据
data1=
1 1 1
1 2 3
1 3 6
load函数将会从文件名所指定的文件中读取数据,并将输入的数据赋给以文件名命名的变量。如果不给定文件名,则系统将自动认为MATLAB.mat文件为操作对象,如果该文件在MATLAB搜索路径中不存在,系统将会报错。
3)Excel电子表格数据读取。将Excel中的数据以矩阵的形式导入MATLAB中,可通过数据交换函数xlsread读取,xlsread函数语法:
data=xlsread('filename', 'sheet', 'range')
其中,filename是目标文件地址;sheet是数据表名称,例如Excel默认表名为sheet1;range是数据在表中的位置,如“$A1∶$C6”等。输出数值矩阵data。
例如,2015年9月1日到2016年3月18日,股票“中国银行”的交易数据保存在Excel文件“sh601988.xls”中,文件内容如表1-11所示。
表1-11 中国银行股票交易行情表
(单位:元)
日期
收盘价
最高价
最低价
开盘价
涨跌幅
2016/3/18
3.43
3.44
3.4
3.42
0
2016/3/17
3.43
3.43
3.39
3.42
-0.2907
2016/3/16
3.44
3.44
3.37
3.37
1.7751
2016/3/15
3.38
3.4
3.34
3.4
-0.5882
2016/3/14
3.4
3.43
3.37
3.39
0
…
…
…
…
…
…
注:书中凡是涉及数据保存在“***文件中”,我们将文件统一放在本书的网站上,供读者下载。
读取其中的数据可输入命令:
zgyh=xlsread('sh601988.xls','sheet1')
结果输出
zgyh =
3.43 3.44 3.40 3.42 0
3.43 3.43 3.39 3.42 -0.2907
3.44 3.44 3.37 3.37 1.7751
3.38 3.40 3.34 3.40 -0.5882
3.40 3.43 3.37 3.39 0
3.40 3.41 3.33 3.33 1.4925
……
(余下数据省略了!)
若读者对Microsoft Excel有一定的使用经验,可使用MATLAB Excel Builder实现MATLAB和Microsoft Excel的连接,从而实现两者数据的无缝接口。更详细的操作请参考有关文献。
2.特殊矩阵与符号矩阵
诸如单位矩阵、零矩阵、元素全为1的矩阵、魔方矩阵、范德蒙矩阵、希尔伯特矩阵、托普利兹矩阵、帕斯卡矩阵、服从特定分布的随机矩阵等,MATLAB提供了专门函数用于生成这些矩阵,参见表1-12。
表1-12 生成特殊矩阵的函数
命令函数
功能说明
A=eye(m,n)
生成一个m行、n列的单位矩阵A
B=zeros(m,n)
生成一个m行、n列的零矩阵B
C=ones(m,n)
生成一个m行、n列的元素全为1的矩阵C
D=magic(n)
生成n阶魔方矩阵D,D中的每行、每列及两条对角线上元素和相等
E=vander(v)
生成以向量v为基础向量的范德蒙矩阵E
F=hilb(n)
生成n阶希尔伯特矩阵F。矩阵F=(fij)n中的元素fij=(i+j-1)-1
G=pascal(n)
生成n阶帕斯卡矩阵G。帕斯卡矩阵由杨辉三角形表组成
H=rand(m)
生成m阶均匀分布的随机矩阵H
randn(m)
生成m阶正态分布的随机矩阵
符号矩阵是由MATLAB的符号运算产生的矩阵,可应用于行列式的计算公式推导。如:
syms x %定义符号变量
f(x)=\[x x^2;1+x^3 2+x^4\];%定义符号矩阵
a=f(3);%将x用3替换得数值矩阵a
3.矩阵中元素或块操作
在MATLAB中,矩阵是基本的计算单元,有很多关于矩阵操作的函数。常用的有矩阵的扩展、块操作、转置、翻转、矩阵尺寸的改变等。对矩阵中元素或块操作见表1-13。
表1-13 矩阵中元素或块的常用操作
表达式或命令函数
功能说明
A(k,:)
提取矩阵A的第k行
A(:,k)
提取矩阵A的第k列
A(:)
依次提取矩阵A的每一列,将A拉伸为一个列向量
(续)
表达式或命令函数
功能说明
A(i1:i2,j1:j2)
提取矩阵A的第i1~i2行、第j1~j2列,构成新矩阵
A(\[a b c d\],:)
提取矩阵A的指定的第a、b、c、d行,构成新矩阵
A(:,\[e f g h\])
提取矩阵A的指定的第e、f、g、h列,构成新矩阵
A(i2:-1:i1,:)
以逆序提取矩阵A的第i1~i2行,构成新矩阵
A(:,j2:-1:j1)
以逆序提取矩阵A的第j1~j2列,构成新矩阵
A(i1:i2,:)=\[\]
删除A的第i1~i2行,构成新矩阵
A(:,j1:j2)=\[\]
删除A的第j1~j2列,构成新矩阵
\[A B\]或\[A;B\]
将矩阵A和B拼接成新矩阵
diag(A,k)
抽取矩阵A的第k条对角线元素向量
tril(A,k)
抽取矩阵A的第k条对角线下面的部分
triu(A,k)
抽取矩阵A的第k条对角线上面的部分
flipud(A)
矩阵A进行上下行翻转
fliplr(A)
矩阵A进行左右翻转
A’
矩阵A的转置
rot90(A)
矩阵A逆时针旋转90°
C=cat(DIM,A,B)
在DIM维度上拼接矩阵A与B,DIM=1或2或3
B=repmat(A,m,n)
把矩阵A当作元素,产生m行与n列的矩阵A组成的大矩阵B
K=kron(A,B)
由矩阵A与B产生卡诺矩阵K,即K=(aij*B),其中A=(aij)
B=reshape(A,m,n)
将矩阵A转换为m×n的矩阵
4.矩阵的运算
(1)矩阵间的运算
两个矩阵之间可按线性代数方法定义加、减、乘、除运算,还可定义同型矩阵间的按元素的点乘、点除、点幂运算,运算规则如表1-14。
表1-14 矩阵间的运算
表达式
功能说明
A+B(A-B)
A与B为同型矩阵,对应元素相加(减)
A*B
A的列数要等于B的行数,按代数学中定义的矩阵乘法法则计算
A/B
X=A/B是线性方程组XA=B的解。当A是可逆的矩阵时,A/B=A*B-1
AB
X=AB是线性方程组AX=B的解。当A是可逆的矩阵时,AB=A-1*B
A.*B
A与B为同型矩阵,对应元素相乘
A./B
A与B为同型矩阵,对应元素相除
A.B
A与B为同型矩阵,A中元素对应B中元素进行乘方运算
(2)矩阵与标量的运算
一个数与一个矩阵间的运算规则如表1-15。
表1-15 矩阵与标量的运算
表达式
功能说明(设A为矩阵,c为标量)
A+c(A-c)
A中每个元素加(减)常数c
A*c(c*A)
A中每个元素乘常数c
A/c
A中每个元素除常数c
(续)
表达式
功能说明(设A为矩阵,c为标量)
c./A
常数c分别被A中对应每个元素相除
c.A
常数c对应于A中每个元素的乘方运算
A.c
对应于A中每个元素对应常数的c次乘方运算
Ac
A是方阵,当c大于0时表示矩阵的方幂,当c小于0时表示A逆的方幂
(3)矩阵的基本函数运算
矩阵的函数运算是矩阵运算中最实用的部分,常用的主要有以下几个,见表1-16。
表1-16 矩阵的函数运算命令
命令
功能
det(A)
方阵A的行列式
inv(A)
方阵A的逆矩阵
\[m,n\]=size(A)
给出A的行列数,输出A的行数m、列数n
\[v,d\]=eig(A)
A的特征向量v及特征值为对角元的对角矩阵d
orth(A)
可逆矩阵A的列向量组正交规范化
rref(A)
矩阵A的阶梯形的行最简形式
rank(A)
矩阵A的秩
trace(A)
矩阵A的迹
\[Q,R\]=qr(A)
矩阵A的Q,R分解,即正交矩阵Q和上三角阵R满足A=QR
\[p,H\]=hess(A)
海森伯格分解,即正交矩阵p与拟上三角阵H满足A=pHp’
(4)矩阵的数据处理
MATLAB具有强大的数据处理功能,如数据的排序、求最大值、求和、求均值等。常用数据处理的命令见表1-17。
表1-17 常用数据处理命令
命令
功能
命令
功能
max(A)求向量或矩阵每列的最大值
mean(A)求向量或矩阵每列的平均值
sum(A)求向量或矩阵每列的元素和
var(A)求向量或矩阵每列的方差
cov(A)矩阵列向量之间的协方差矩阵
length(A)求向量所含元素个数
min(A)求向量或矩阵每列的最小值
median(A)求向量或矩阵每列的中位数
prod(A)求向量或矩阵每列的元素乘积
std(A)求向量或矩阵每列的标准差
corrcoef(A)矩阵列向量间的相关系数矩阵
find(A)求向量中满足条件的元素
5.多维数组
在MATLAB中可以创建高维数组。习惯上二维数组中的第1维称为“行”,第2维称为“列”,二维数组可视作“矩形面”。三维数组是二维数组的扩展,用三个下标表示,在二维数组的基础上增加了一维称为“页”,三维数组可视作“长方体”。在MATLAB中将三维及三维以上的数组统称为高维数组。
创建三维数组的方法有以下几种。
1)按“页”创建。
A(:,:,1)=\[1,2,3;4,5,6;7,8,9\]; %创建数组A的第1页
A(:,:,2)=8;%创建数组A的第2页,每个元素赋值为8
2)由函数ones、zeros、rand直接创建。
>>A=rand(2,3,2)%创建A为2行、3列、2页的数组
A(:,:,1) =
0.8147 0.1270 0.6324
0.9058 0.9134 0.0975
A(:,:,2) =
0.2785 0.9575 0.1576
0.5469 0.9649 0.9706
3)由函数cat、repmat、reshape生成数组。
>>a=\[1 2;3 4\];
>>b=\[5 6;7 8\];
>>c=cat(3,a,b)%沿着第3维创建c为2行、2列、2页的数组
三维数组的元素的存取操作可类似于二维数组采用下标法。
6.元胞数组
元胞数组是MATLAB的一种特殊数据类型,每个元素以单元的形式存在。在MATLAB中,采用大括号“{}”或函数cell建立元胞数组。在获取元胞数组的元素时,采用大括号表示下标,如下列程序中a{1,1}表示元胞数组中第一行、第一列的元胞。
clear all;
a={\[1 2 3;4 5 6;7 8 9\],20;ones(2,3),1:10}%创建元胞数组a
b=a{1,1}%从元胞数组中读取元素a{1,1},该元素为矩阵赋给b
c=a{2,2}(3)%从元素a{2,2}读取第三个数据a{1,1}(3)
a{1,2}=magic(3)%给元素a{1,2}重新赋值为一个三阶魔方矩阵
程序运行结果:
a =
\[3x3 double\] \[ 20\]
\[2x3 double\] \[1x10 double\]
b =
1 2 3
4 5 6
7 8 9
c =
3
a =
\[3x3 double\] \[3x3 double\]
\[2x3 double\] \[1x10 double\]
在数据分析中,将不同维数与大小的矩阵作为元胞放在一个元胞数组中,这样有利于数据的调用,提高了工作效率。例如在回归分析、神经网络建模中,都大量地使用了元胞数组。