在预备篇中,我们介绍了矩阵和数组的基础概念,在本章,我们将来具体的介绍矩阵和数组的建立、修改、使用等等一系列内容
一、矩阵的输入
在MATLAB中的矩阵表示应遵循的以下基本常规:
- 使用方括号([])括起来矩阵内的元素,方括号内部的元素按行或列排列。
- 使用分号(;)分隔行,每一行的元素可以通过一个分号进行分隔。
- 使用逗号(,)或空格分隔列,每一列的元素可以通过一个逗号或空格进行分隔。
- 元素可以是数值或者表达式
(一)通过显式元素列表输入矩阵
对于比较小的简单矩阵,可以通过显式元素列表直接输入矩阵。
有以下输入方式:
a=[1 2;3 4;5 6]
a=[1,2;3,4;5,6]
a=[1 2
3 4
5 6]
(二)通过语句生成矩阵
对于较复杂的矩阵有以下几种生成方式:
(1)用from:step:to方式生成行向量
from:to
from:step:to
例:
a=2:5
%a =2 3 4 5
a=[1:2:6;2:2:7]
%a =1 3 5
% 2 4 6
a=4:-1:3
%a =4 3
a=3:-1:4
%a =
% 空的 1×0 double 行向量
(2)用linspace和logspace函数方式生成向量
linspace
linspace 函数可以生成指定范围内的等间距元素值,并返回一个向量。
V = linspace(start, stop, n)
%start:起始值。stop:结束值。n:向量中的元素数量。
例:
A = linspace(1, 10, 5); % 生成一个从1到10之间,包含5个等间距的元素的向量
%A =
% 1 3 5 7 10
A=[linspace(1, 10, 5);linspace(6, 15, 5);linspace(12, 21, 5);linspace(99, 108, 5)]%(format rat)
%A =
% 1 13/4 11/2 31/4 10
% 6 33/4 21/2 51/4 15
% 12 57/4 33/2 75/4 21
% 99 405/4 207/2 423/4 108
logspace
logspace 函数可以生成指定范围内的对数空间元素值,并返回一个向量。
V = logspace(start, stop, n)
%start:起始值的对数。stop:结束值的对数。n:向量中的元素数量。
例:
B = logspace(0, 2, 4); % 生成一个从10^0到10^2之间,包含4个对数间距的元素的向量
%“四个对数间距”:即,第一个元素是 10^0^ = 1,第二个元素是 10^(1/3)^≈ 2.1544,第三个元素是 10^(2/3)^ ≈ 4.6416,最后一个元素是 10^2^ = 100,因此,生成的向量是 [1, 2.1544, 4.6416, 100]。
B = logspace(1, 6, 6);% 生成一个从10^1到10^6之间,包含6个对数间距的元素的向量
%B =10 100 1000 10000 100000 1000000
注意,根据 linspace 和 logspace 函数的语法,返回的结果都是向量,可以是行向量(默认)或列向量。
(3)用特殊函数方式生成特殊矩阵
矩阵类型 | 功能 | 语法 | 解释 |
---|---|---|---|
零矩阵 | 所有元素都为零的矩阵 | Z = zeros(m, n) | m:矩阵的行数;n:矩阵的列数 |
单位矩阵 | 主对角线上的元素都为1,其余元素都为0的矩阵 | I = eye(n) | n:矩阵的维度(行数和列数相等) |
对角矩阵 | 对角矩阵是一个只有主对角线上有非零元素,其余元素都为零的矩阵 | D = diag(v) | v:包含主对角线上元素的向量 |
全一矩阵 | 所有元素都为1的矩阵 | O = ones(m, n) | m:矩阵的行数。n:矩阵的列数 |
随机矩阵 | 产生均匀分布的随机矩阵,取值范围为0.0~1.0 | R = rand(m, n) | m:矩阵的行数;n:矩阵的列数 |
随机矩阵 | 产生正态分布的随机矩阵 | R = randn(m, n) | m:矩阵的行数;n:矩阵的列数 |
魔方矩阵 | 矩阵的行、列和对角线上元素的和相等 | E=magic(n) | n:方阵的阶数 |
逻辑矩阵 | 全为true(1)或全为false(0) | Q=true(m,n);Q=false(m,n) | m:矩阵的行数;n:矩阵的列数 |
注:以上函数中,需要两个参数的函数如若只输入一个参数n,则默认为n阶方阵。
二、矩阵的元素
(一)矩阵的元素表示
(1)、矩阵中单个元素的表示
在输入一个矩阵之后,要进行处理时,可能会涉及对矩阵中单个元素进行处理的情况,那么然后让软件获取这个数据就是一件比较关键的事情。
在MATLAB中,矩阵的元素有两种用下标表示的方式,一种是用该元素的行和列的编码来表示;另一种是用该元素的顺序来表示。
- 1、全下标方式
一个矩阵A中第m行n列的元素记作A(m,n)。而A(m,n)=N,意味将A(m,n)修改为N。
在提取矩阵元素时,如果所使用的行数或列数大于矩阵的行数或列数,MATLAB会自动报错;而在赋值时如果所使用的行数或列数大于矩阵的行数或列数,矩阵会被自动扩充,扩充部分用0填充。 - 2、单下标方式
在矩阵中,矩阵元素可以按照列从左向右的顺序从上到下依次标号1、2、3、……
在m行n列的矩阵A中,A(i,j)对应的单下标为(j-1)*m+i
例如矩阵A:
1(1) | 8(4) | 5(7) | 9(10) |
---|---|---|---|
8(2) | 6(5) | 9(8) | 8(11) |
7(3) | 1(6) | 5(9) | 0(12) |
其中A(2,3)==A(8)==9;A(1,2)==A(4)==8
不仅如此,单下标方式也可以取出多个值,如A(7:9),取出A矩阵中编号7~9的元素。
(2)、矩阵中子矩阵的产生
在MATLAB中,可以通过利用矩阵下标来产生子矩阵,即子矩阵是从对应矩阵中取出一部分元素构成的。参照上一节中,对矩阵元素的表示,我们可以采用2+1中方式来产生子矩阵。
1.全下标方法:
-
a([1 3]),[2 3]):原始矩阵中第 1 行和第 3 行,并且只选择每行中的第 2 列和第 3 列。
-
a(1:3,2:3):始矩阵中第 1 行到第 3 行,并且只选择每行中的第 2 列到第 3 列。
-
a(:,3):原始矩阵中的第 3 列的所有元素。
-
a(3,:):原始矩阵中的第 3 行的所有元素。
-
a(1:3,end):原始矩阵中从第 1 行到第 3 行的最后一列的元素(end意为最大值)。
-
a(end,1:3):原始矩阵中最后一行的从第 1 列到第 3 列的的元素。
综上所述,括号中,逗号前为列的范围,逗号后为行的范围,确定了行和列的范围,子矩阵自然确定。
2.单下标方法:
- a([1 3;2 6]):取单下标为1、3和2、6的元素构成子矩阵
3.逻辑矩阵:
逻辑矩阵通过建立逻辑数组,取出相应元素组成矩阵。
首先要建立逻辑数组:
a=[false,true,true]
%或a=[0,1,1]
b=[true,false,true]
%或b=[1,0,1]
逻辑数组元素的值不一定,都是要在矩阵行列数的范围之内,不能超出矩阵的大小。
在数组中为true(1)的位置是要取得的,为false(0)的位置是不取的。
然后将逻辑数组按照全下标方式组合:
A(a,b)
此时,就取出了A矩阵中第2、3行的第1、3列的元素
(二)矩阵的赋值
在我们表示了矩阵中的某个元素或者某个子矩阵后,可以直接对其进行赋值修改。
- 全下标方式
A(i,j)=B
给A矩阵的部分元素赋值,则B矩阵的行列数必须等于A矩阵中相应位置的行列数,等号左右侧的大小必须相同。
- 单下标方式
A(s)=b
A(s:n)=b
b为向量,元素个数必须等于A矩阵的元素个数,但是,有一个例外情况是,如果b只有一个元素,那么A中被赋值的位置均将被赋值为b元素的值。a(1:3)=2
a矩阵中1~3号元素竣备赋值为2。
- 全元素方式
A(:)=B
给A矩阵的所有元素赋值,则B矩阵的所有元素总数必须等于A矩阵的元素总数,但是行列数不一定相等,即将A、B 矩阵中的元素单下标相等的一一对应赋值。
如果要实现A=B,那么A、B矩阵的行列数必须相同。
- 矩阵的扩增
当我们对矩阵中的某个元素进行赋值时,如果该元素的位置超出了目前矩阵的大小,那么该矩阵会自动扩增至该元素所在的行和列,并将多出来的位置,填充0。
该方式适用于全下表,因为单下标所指示的位置通常没有明确的行和列。
(三)矩阵的删除和连接
在MATLAB中可以对矩阵的单个元素、子矩阵块或所有元素进行删除操作,方法是将其赋值为空矩阵([])。同时,我们也可以将一些相似的矩阵连接起来形成一个较大的矩阵。
一、矩阵元素的删除
- 删除一列/行元素
a(:,3)=[]
%删除第三列元素
a(3,:)=[]
%删除第三行元素
- 删除单个元素
a(1)=[]
%按单下标方式删除一个元素,剩余的元素展开为行向量
- 删除所有元素
a=[]
%将a矩阵变为空矩阵
二、矩阵的连接(生成大矩阵)
在MATLAB中,我们可以通过方括号“[]”将小矩阵连接起来生成一个较大的矩阵。
[a;a]%将两个a矩阵上下连接成一个大矩阵
[a a]%将两个a矩阵左右连接成一个大矩阵
[a(1:2,1:2) 10*a(1:2,2:3)]%将a矩阵选取子矩阵经计算后再左右连接
值得注意的是,相连接的两个矩阵一定要在行或列上相等,否则将报错。
(四)矩阵的翻转
在线性代数中,我们可以求一个矩阵的转置,在MATLAB中,相对应的,我们可以将一个矩阵通过编写语句转动或转置。
- flipud(A):将矩阵 A 上下翻转,即交换行的顺序。
功能:将矩阵的上下顺序颠倒。
- fliplr(A):将矩阵 A 左右翻转,即交换列的顺序。
功能:将矩阵的左右顺序颠倒。
- rot90(A, k):将矩阵 A 逆时针旋转 90 度。
功能:将矩阵按逆时针方向旋转指定的角度。参数 k 控制旋转的次数,默认为 1。
- flipdim(A,dim):使矩阵沿特定轴翻转。
功能:dim=1时,同 flipud(A);dim=2时,同fliplr(A)
- transpose(A) 或 A.':将矩阵 A 进行转置,即将行变成列,列变成行。
功能:交换矩阵的行和列。
- triu(A):返回一个与矩阵 A 大小相同的上三角矩阵。
功能:提取矩阵 A 的上三角部分,下三角部分的元素被置为零。
- tril(A):返回一个与矩阵 A 大小相同的下三角矩阵。
功能:提取矩阵 A 的下三角部分,上三角部分的元素被置为零。
三、多维数组
上文介绍了矩阵,也可以视为一种由行和列组成的二维数组,但数组的结构并不只局限于二维,也可以推广到三维进行分层,即在二维数组的基础上增加了一维称为“页”。以此类推我们也可以推广出四维甚至更高维的数组。以下,以三维数组为例进行讲解。
(一)多维数组的创建
- 通过全下标元素赋值方式创建
在二维数组(矩阵)中,我们可以用全下标方式A(m:n;a:b)
的方式表示A中的子矩阵,此时我们可以在括号内再加一个逗号表示多一个维度,通过赋值的方式创建多维数组。
A(:,:,2)=[1 2;3 4]
此时给数组A的第二页赋值了矩阵[1 2;3 4],第一页便自动用零填充为[0 0;0 0]。
如果赋值的是一个标量,那么该页便会基于有元素的一页的行列数,元素均为该标量。
- 通过函数ones、zeros、rand、randn直接创建
rand(2,3,4)
结果为
ans(:,:,1) =0.8147 0.1270 0.6324 0.9058 0.9134 0.0975
ans(:,:,2) =
0.2785 0.9575 0.1576 0.5469 0.9649 0.9706
ans(:,:,3) =
0.9572 0.8003 0.4218 0.4854 0.1419 0.9157
ans(:,:,4) =
0.7922 0.6557 0.8491 0.9595 0.0357 0.9340
- 利用函数生成
(二)多维数组的标识
四、矩阵和数组运算
在线性代数中,我们了解到了计算矩阵行列式的值;求秩、转置、逆;矩阵与矩阵之间进行计算等等矩阵、行列式的运算,在MATLAB中,也有一系列的方程或语句能够达成该种运算目的。
(一)矩阵运算的函数
-
det(X):计算矩阵行列式。
-
rank(X):求矩阵的秩,得出的行列式不为0的最大方阵的边长。
-
inv(X):求逆矩阵
(当且仅当det(X)!=0,inv(X)成立)(当det(X)=0或值极小接近于零时,计算inv(X)时,其精度很低MATLAB会提示精度较低)。 -
[v,d]=eig(X):计算矩阵的特征值和特征向量。如果方程Xv=vd存在非零解,则v为特征向量,d为特征值。
-
diag(X):产生X矩阵的对角矩阵。
(当X为一维行向量时,diag(X)产生以X中元素为对角线元素,其余部分用零填充的对角矩阵;而X为二维矩阵时,diag(X)产生其对角线元素的竖行矩阵,如果行列数不等,则为从左往右的min(行数,列数)*min(行数,列数)方阵的对角线) -
[l,u]=lu(X):方阵分解为一个准下三角方阵和一个上三角方阵的乘积。l为准下三角方阵,必须交换两行才能成为真正的下三角阵。u为上三角方阵。
-
[Q,R]=qr(X):将m*n阶矩阵分解为一个正交方阵Q和一个与X同阶的上三角矩阵R的乘积,方阵Q的边长为矩阵X的n和m中的较小值,且其行列式值为1。
(二)矩阵和数组的算术运算
一、加(减)法运算
矩阵和数组的加(减)法运算法则完全一致,将两个矩阵或数组中的元素一一对应相加,则相加(减)的两个矩阵行列数应对应相等。
表达式为:A+B
A-B
如果A和B 中有一个是标量,则需将该元素与矩阵的每一个元素相加(减),例如矩阵A+2,即为将矩阵A中的每一个元素都加2。
二、乘法运算
矩阵的乘法和数组的乘法略有不同
矩阵的乘法法则正如我们在线性代数中学习的,乘号前的矩阵的行元素逐个与乘号后的矩阵的列元素相乘之和,如此得出的新矩阵便为矩阵的乘法,当其中一个元素为标量时,同数组乘法。
而数组的乘法只需要将两数组对应位置的元素相乘即可。
- 矩阵乘法
A*B
- 数组乘法
A.*B
数组相乘要求两数组行列数对应完全一致,矩阵相乘要求两矩阵行列对称相等
三、除法运算
矩阵和数组的除法都可以分为左除和右除两种,即除以和被除以。
- 矩阵除法
A\B
A/B
A\B=A-1xB,为AX=B的解
A\B=AxB-1,为XA=B的解
(A-1代表矩阵的逆) - 元组除法
A.\B
A./B
A、B两数组必须大小相同,除非其中有一个是标量。
四、乘方
- 矩阵的乘方
A^B
(A可以为矩阵或向量)
- 当A为矩阵时,必须为方阵
B为正整数时,A的B次幂
B为负整数时,A的逆矩阵的B次幂
B为矩阵时,出错
B为非整数时,涉及特征值和特征向量的求解,A^B=W*D^B/W
(将A拆分为W*D/W,D为对角阵) - A为标量时
B为矩阵时,将A分解为W*D/W,D为对角阵,A^B=W*diag(D.^B)/W
- 数组的乘方
A.^B
- A为矩阵,B为标量时,将数组A自乘B次
- A为矩阵,B为矩阵时,A、B数组必须大小相同,将A中的元素自乘B中相对应位置元素次
- A为标量,B为矩阵时,将A^B(i,j)构成新矩阵的第i行j列元素
(三)矩阵和数组的转置
- 矩阵的转置
A'
若A为复数矩阵,则为共轭转置,实数矩阵则不是。 - 数组的转置
A.'
复数矩阵,实数矩阵均不是共轭转置
注:共轭转置,将矩阵的每个元素取共轭,然后再对矩阵进行转置。
例:
A = [1 + 2i, 3 - i;4 + 5i, 6 - 7i]
A'= [(1 + 2i)^*, (4 + 5i)^*;
(3 - i)^*, (6 - 7i)^*]
= [1 - 2i, 4 - 5i;
3 + i, 6 + 7i]^T
= [1 - 2i, 3 + i;
4 - 5i, 6 + 7i]
(四)矩阵和数组的数学函数
1.数组的算术运算函数:
包括abs、sqrt、三角函数【sin()、cos()、tan()】、
反三角函数【asin()、acos()、atan()】、双曲三角函数【sinh()、cosh()、tanh()】、exp、log、log10等
2.矩阵中与数组函数不同的:
expm、logm、sqrtm······
(五)关系操作与逻辑操作
(待续,不是非常重要)
(六)运算的优先级
运算的优先级从高到低依次为:
- 括号:()、[]、{}。括号可以用来改变运算符的优先级。
- 数组转置 (.‘)、数组幂 (.^ )、矩阵转置 (’)、矩阵幂 (^)
- 乘法、除法和取余:、/、\、.、./、.、%。
- 加法和减法:+、-。
- 冒号 :。
- 关系运算符:<、>、<=、>=、==、~=(不等于)。
- 逻辑运算符:&(与)、|(或)、~(非)。
- 逻辑与: &
- 逻辑或: |
- 先决与 :&&
- 先决或:||
表达式中存在多个运算符时,根据优先级,高优先级的运算符会先进行计算。如果有相同优先级的运算符,则按照结合性(从左到右或从右到左)进行计算。