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

    xiaoxiao2024-02-22  126

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

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

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)