一、矩阵的创建
1、直接输入法
输入矩阵时要以中括号“[ ]”作为标识符号,矩阵的所有元素必须都在中括号内。矩阵的同行元素之间用空格或逗号分隔,行与行之间用分号或回车键分隔。
a = [1 2 3; 4 5 6]
c = [2 5
6 7]d = [3 6;
6 9]
2、函数创建法
(1)zeros:全为0的矩阵
①zeros(n):n行n列全为0的矩阵
②zeros(m,n):m行n列的矩阵
(2)ones:全为1的矩阵
用法与 zeros 相同
(3)eye:主对角线元素为 1 且其他位置元素为 0
e = eye(4)
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
eye(4,3)
1 0 0
0 1 0
0 0 1
0 0 0
eye(3,4)
1 0 0 0
0 1 0 0
0 0 1 0
(4)rand:创建区间0和1内均匀分布的随机数
① rand(n)可以创建一个n行n列的随机数矩阵;
② rand(m,n)可以创建一个m行n列的随机数矩阵。
(5)randi:
randi ( [ imin , imax ] , m , n )
用来创建一个m行n列的随机数矩阵,该随机数矩阵中的每个元素都是从区间[imin,imax]内随机抽取的整数。
如果imin等于1,那么可以简写为randi(imax,m,n)
(6)randn:正态分布
① randn(n)可以创建一个n行n列的随机数矩阵
② randn(m,n)可以创建一个m行n列的随机数矩阵
(7)diag:创建对角矩阵或者获取矩阵的对角元素
diag(v,k) 将向量v的元素放置在第k条对角线上,其他位置元素为0。 k=0 表示主对角线,k>0 位于主对角线上方,k<0 位于主对角线下方。 如果k=0, 可以直接写成diag(v)。
diag([1,2,3])
1 0 0
0 2 0
0 0 3
diag([1,2,3],-1)
0 0 0 0
1 0 0 0
0 2 0 0
0 0 3 0
diag([1,2,3],2)
0 0 1 0 0
0 0 0 2 0
0 0 0 0 3
0 0 0 0 0
0 0 0 0 0
如果输入的第一个参数是矩阵,则表示获取矩阵的对角元素。 diag(A,k) 返回A的第k条对角线上元素的构成的列向量。 k表示对角线编号,我们将其指定为一个整数。 k=0 表示主对角线,k>0 位于主对角线上方,k<0 位于主对角线下方。如果k=0, diag(A, 0)可以直接写成diag(A)。
二、矩阵元素的引用
1、矩阵的表示方式
① 双下标索引
即用行和列进行表示 a(1,2)
a([1 3], [1 3 5]) 第一三行、第一三五列的元素
a(1:2:end, 1:2:end) 奇数行且奇数列对应的元素
size函数
size(A) 返回一个行向量,其元素是 A 的相应维度的长度。
s = size(A) 返回[4,6],表示有4行和6列
size(A,dim)返回在维度dim上的长度。dim=1表示行;dim=2表示列
size函数可以有两个返回值,第一个返回的元素用来保存行数;第二个返回的元素用来保存列数
[r, c] = size(A)
A(:, n) 表示矩阵A的第n列的所有元素。
A(m, :) 表示矩阵A的第m行的所有元素。
②单下标索引(线性)
将矩阵的所有元素按照线性排为一列
A(:) 命令可以将A中的所有元素按照线性索引的方式重构成一个列向量
对向量也有同样的效果:a(:)
sub2ind和ind2sub两个函数可以进行对单下标和双下标之间进行转化(用到较少)
三、矩阵元素的修改和删除
1、修改矩阵元素
与向量相似,直接更改
双下标式:
A(2,3) = 10
A(3,:) = 100
A([1,3],[2,3]) = [8 88; 888 8888]
单下标式:
A(4) = 10
A(1:2:end) = 0
A([3,5,6]) = [8 88 888]
2、拓展矩阵
通过将一个或多个元素置于矩阵现有的行和列索引边界之外,可以将它们添加到矩阵中。MATLAB 会自动用 0 填充矩阵,使其保持为矩形。
A = [10 20 30; 60 70 80]
A(3,4) = 1
10 20 30 0
60 70 80 0
0 0 0 1
通过在现有索引范围之外插入新矩阵来扩展其大小
A(【2:3】,【5:6】)
3、删除元素
① 将等号右边改为【】
注:此办法只能删除矩阵的整行或者整列
② 过线性索引来删除矩阵的元素
A = [1:4; 2:5; 3:6];
A(1:4) = [ ]
使用线性索引不需要删除一整行或者一整列
四、矩阵的拼接和重复
1、拼接矩阵
包括横向拼接和纵向拼接
横向拼接要求矩阵的行数相同;纵向拼接要求矩阵的列数相同
(1)横向拼接
① 直接 [A, B] 或 [A B]
② horzcat(A,B) or cat(2,A,B)
(2)纵向拼接
① 命令[A; B]
② vertcat(A,B) or cat(1,A,B)
注: cat 函数
cat(dim,A,B)表示沿维度 dim 方向将矩阵B拼接到矩阵A的末尾。
dim = 1时表示从上自下沿着行方向拼接,即纵向拼接,因此cat(1,A,B)等价于vertcat(A,B);
dim = 2时表示从左自右沿着列方向拼接,即横向拼接,因此cat(2,A,B)等价于horzcat(A,B);
2、重复矩阵
函数 repmat(A,m,n)对整个矩阵进行重复
对矩阵中的元素进行重复函数(了解即可):
repelem(A,m,n)
五、矩阵的重构和重新排列
1、reshape函数
reshape函数可以改变矩阵的形状,例如有一个矩阵A,它原来的大小是2行6列,我们需要将其形状变成3行4列,那么,我们可以使用命令:reshape(A, 3, 4).
注: A和B中的元素个数是相同的。
reshape函数实际上是按矩阵的线性索引来重新组织矩阵元素的。也就是说,它先取矩阵A的第一列,然后是第二列,依此类推,再按新的维度重新组织这些元素。因此,转换后的B矩阵中的元素和A矩阵中的元素是完全相同的,即A(:)和B(:)的结果完全相同。
2、sort函数
用来对向量或者矩阵进行排序。如果是矩阵的话,可以对矩阵的每一行或每一列分别进行排序。
(1)对向量v排序:
sort(v) 可以将向量v按照从小到大的顺序进行升序排列
sort(v,'descend')可以将向量v按照从大到小的顺序进行降序排列
[sort_v , ind] = sort(v) sort_v是排序后的向量,ind是排序后的向量中的每个元素在v向量中的索引
两个输出的向量的方向和sort函数中输入的v向量的方向一致,都是行向量
(2)对矩阵A 排序
sort(A,dim)
dim = 1时,沿着行方向(从上至下)对矩阵的每一列按照从小到大的顺序分别进行排序
dim = 2时,沿着列方向(从左至右)对矩阵的每一行按照从小到大的顺序分别进行排序
注意:
(1)当dim=1时,sort(A,1)可以直接写成sort(A);
(2)默认是升序排列的,在最后面加一个输入参数'descend',变成从大到小的降序排列;
(3)可以有两个返回值,表示排序后的元素在原矩阵所在行或所在列中的索引。
3、sortrows函数
可以基于矩阵的某一列对矩阵进行排序,排序后得到的新矩阵的同一行元素不会改变。
详情见 D:\111数模\配套的MATLAB代码和资料\第3章配套代码(版本:2024年4月8日)
sort函数一般只用于对向量进行排序;如果是矩阵或者表格排序,我们一般使用sortrows函数
4、flip / fliplr / flipud函数
flip:翻转元素的顺序; fliplr:将数组从左向右翻转 ;flipud:将数组从上向下翻转
(1)flip(A)
如果 A 为向量,flip(A) 将沿向量的长度方向翻转元素顺序。
A = [5 2 7 8 9]; % 行向量
flip(A)9 8 7 2 5
如果 A 为矩阵,flip(A) 将反转每列元素的顺序。
C = [5 8 7;
4 2 6;
3 5 8;
6 4 1];
flip(C)6 4 1
3 5 8
4 2 6
5 8 7
(2)flip(A,dim)
flip(A,dim) 沿维度 dim 翻转 A 中元素的顺序。
如A 为矩阵,
flip(A,1) 将沿着行方向对矩阵A上下翻转
C = [5 8 7;
4 2 6;
3 5 8;
6 4 1];
flip(C,1) % 等价于flip(C) 或者 flipud(C)6 4 1
3 5 8
4 2 6
5 8 7
flip(A,2) 将沿着列方向对矩阵A左右翻转。
flip(C,2) % fliplr(C)
7 8 5
6 2 4
8 5 3
1 4 6
5、rot90函数
旋转矩阵
rot90(C) 逆时针方向旋转90度
rot90(C,2) 逆时针方向旋转90*2=180度
rot90(C,3) 逆时针方向旋转90*3=270度
rot90(C,-1) 逆时针旋转-90度;等价于顺时针旋转90度