MATLAB 数据分析方法(第2版)1.4 数组和矩阵运算-阿里云开发者社区

开发者社区> 华章出版社> 正文
登录阅读全文

MATLAB 数据分析方法(第2版)1.4 数组和矩阵运算

简介:

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

在数据分析中,将不同维数与大小的矩阵作为元胞放在一个元胞数组中,这样有利于数据的调用,提高了工作效率。例如在回归分析、神经网络建模中,都大量地使用了元胞数组。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: