引言
警告!警告!你现在所查看的这一章,是matlab最核心、最重要的功能区块。务必将向量组、数组(我学了C,还是这样叫比较顺口)、矩阵及其运算学明白。在学习本章之前,请观看者有线性代数入门知识,至少要学到特征值部分,不然理解会十分困难。倘若你准备好的话,进入这一章的学习之旅吧。
第二章 向量和矩阵
本章将从初学者角度入手,教会你如何利用这个闻名世界的工具计算线代中复杂的矩阵和向量运算:转置、求逆、点乘、矩阵乘。
一、如何生成/定义一个向量
1.冒号表达式
向量生成与子矩阵提取最常用的表达式为冒号表达式。利用冒号表达式生成向量的具体格式为:V=a:b:c
该函数将生成一个行向量v,其中a为向量的起始值,b为步距,即从a出发,每隔步距b取一个点,直至不超过c这个最大值,如果b省略,步距默认为1。一般来说,步距也可以为负值:
>> V = pi:-0.01:-2
V =
列 1 至 5
3.1416 3.1316 3.1216 3.1116 3.1016
后方若干个元素为节省篇幅已经省略。
2.定义行向量的直接输入法
和生成行向量的代码并不同:定义指的是这个向量内的值都是已知的,定义时可以直接写A=[a,b,c],这里既可以用逗号来分割,也可以用空格。
>> A = [8,9,10]
A =
8 9 10
3.列向量的定义法
Ⅰ 直接输入法
元素之间既不用逗号,也不用空格,用回车来代替:
>> A = [1
2
3
4
]
A =
1
2
3
4
Ⅱ 转置法
将行向量转变为列向量,转置符号为“‘”(单引号):
>> A = [1 2 3 4]'
A =
1
2
3
4
你明白了吗?
4.函数生成法
Ⅰ linspace函数
使用linspace(start,end,n)来创建两个限定值(对实数和复数都可用)之间固定数量的值,该函数用于生成等间隔向量,会生成从start到end之间的n个等间隔数值,start为起始值,看作闭区间的左侧,end为终止值,看作闭区间的右侧:
>> A = linspace(1,5,3)
A =
1 3 5
当要生成100个数据时,n可以省略,默认生成100个。你可能会看到关于endpoint使得序列成为右开区间的用法,这一用法在R2022a已经失效,仅当了解:
>> A = linspace(1,5,3,false)
错误使用 linspace
输入参数太多。
Ⅱ 随机、单位和全0
使用zeros(1,n)、rand(1,n)和ones(1,n)函数:第一个生成有n个0的行向量,第二个随机生成包含从0-1的n个数的行向量,第三个生成有n个1的行向量。
Ⅲ logspace函数
格式为logspace(a,b,n),生成从10的a次方开始,到10的b次方结束的共n个向量的一维数组:
>> A = logspace(2,10,8)
A =
1.0e+10 *
列 1 至 5
0.0000 0.0000 0.0000 0.0000 0.0004
列 6 至 8
0.0052 0.0720 1.0000
在R2022a版本中,并不可以输入log2space输出2的a次方序列,大家可以尝试一下。
二、如何生成/定义一个矩阵
1.利用函数生成矩阵
Ⅰ 函数集锦
ones(n):产生n行n列的全1矩阵,ones(m,n):产生m行n列的全1矩阵;zeros()函数:同理;
rand()函数:产生在(0,1)区间均匀分布的随机阵,生成方式参考ones函数。
randn()函数:产生均值为0,方差为1的标准正态分布随机矩阵;
tril()下三角矩阵;triu()上三角矩阵;eye()函数:产生单位阵;
diag(X):若 X 是矩阵,则 diag(X) 为 X 的主对角线向量(且以列向量方式排布),若 X 是向量,diag(X) 产生以 X 为主对角线的对角矩阵,其余元素由0补齐,这一部分比较抽象,上代码:
A =
1 2 3
4 5 6
7 8 9
>> diag(A)
ans =
1
5
9
>> B = diag(ans)
B =
1 0 0
0 5 0
0 0 9
Ⅱ diag函数
diag(X,k)是提取矩阵第k条对角线的元素;diag(v,k)用于生成主对角线上数第k条对角线为向量v的矩阵,若k为负值则向下数k条:
A =
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
>> diag(A,2)
ans =
3
8
>> diag(A,-2)
ans =
9
14
v =
1
2
3
>> diag(v,1)
ans =
0 1 0 0
0 0 2 0
0 0 0 3
0 0 0 0
>> diag(v,-1)
ans =
0 0 0 0
1 0 0 0
0 2 0 0
0 0 3 0
Ⅲ 新旧版本的小差异
你可能还会看到利用函数linspace来生成矩阵的,这个方式在R2022a中并不适用,格式为:linspace([start1,start2…],[end1,end2…],n),start系列为每一行的起始值,end系列为每一行的终止值,n为列数,旧版本可以试着用:
>>A = linspace([1,2],[3,10],4)
Ⅳ 特殊矩阵的生成
大部分已经在第一部分介绍过,补充魔方矩阵(幻方矩阵):该矩阵一定为方阵,且对角线元素之和与每行、每列之和相等,每个元素不能相同,生成n阶魔方矩阵的命令为magic(n),n为阶数,魔方矩阵没有二阶,且同一阶的幻方矩阵不止一个。但是Matlab是按照固定的算法来生成的,所以每次调用该函数生成的魔方矩阵都相同。可以通过第五部分介绍的翻转函数和转置函数(除符号外,转置行为也有专门的函数)来得到另外6种形式,函数本身不在这里介绍,但是提一下引用的方式:
>> A = magic(4);
>> B = flipud(A);
>> C = fliplr(A);
>> D = flipud(fliplr(A));
>> E = flipud(transpose(A));
>> F = fliplr(transpose(A));
>> G = flipud(fliplr(transpose(A)));
2.定义矩阵的直接输入法
矩阵内容放在方括号内,利用逗号隔开同一行的元素,不同行使用分号(分号可以用回车来代替)分隔开:
>> A = [1,2,3;4,5,6;7,8,9]
A =
1 2 3
4 5 6
7 8 9
>> A = [1,2,3
4,5,6
7,8,9]
A =
1 2 3
4 5 6
7 8 9
三、子矩阵的提取及修改
1.子矩阵/子元素的提取
Ⅰ 子矩阵
B=A(v1,v2) v1表示子矩阵要保留的行号(多个行号使用分号隔开)组成的向量,v2表示子矩阵要保留的列号组成的向量
A =
1 2 3
4 5 6
7 8 9
>> B = A(1:2,2:3)
B =
2 3
5 6
Ⅱ 子元素
由Ⅰ可见,如果我们想要其中的一个元素,直接输入A(m,n)即可。这些手段对于向量同样适用。如果要提取所有的行或者所有的列,逗号前或者逗号后保留冒号即可:
A =
1 2 3
4 5 6
7 8 9
>> B = A(:,1:2)
B =
1 2
4 5
7 8
Ⅲ 额外的用法
在表达式中引入步距,譬如你想调用1,3,5,7列这样均匀的列数,完全不必单独输入:
>> A = rand(6);
>> B = A(1:2:5,1:2)
B =
0.8143 0.6160
0.9293 0.3517
0.1966 0.5853
这个格式在向量位置介绍过,提取了1:2:5的行,实质上就是1、3、5行,以1为起始值,2为步距,5为终止值,并且提取了1、2两列,我们看看A的对应位置是不是这些数据:
>> A
A =
0.8143 0.6160 0.9172 0.0759 0.5688 0.3112
0.2435 0.4733 0.2858 0.0540 0.4694 0.5285
0.9293 0.3517 0.7572 0.5308 0.0119 0.1656
0.3500 0.8308 0.7537 0.7792 0.3371 0.6020
0.1966 0.5853 0.3804 0.9340 0.1622 0.2630
0.2511 0.5497 0.5678 0.1299 0.7943 0.6541
完全相符,放心使用。
2.子矩阵/元素的修改
提取子元素或者子矩阵直接赋值,以下是代码示例,不再详细介绍格式
A =
1 2 3
4 5 6
7 8 9
>> A(1:2,2:3) = [10,11;11,12]
A =
1 10 11
4 11 12
7 8 9
注意不要混淆对象,要直接对子矩阵修改,而不是再将子矩阵赋值给某个变量,再修改变量,那样对原矩阵不会做任何改动。
四、矩阵的拼接与扩展(主要借助逗号、分号的灵活使用,很重要)
1.行向量拼接
在A矩阵的最下方扩展一行,加入行向量v,先对A和v进行定义,新矩阵B=[A;v]。
A =
1 2 3
4 5 6
7 8 9
>> v = [11,12,13];B = [A;v]
B =
1 2 3
4 5 6
7 8 9
11 12 13
2.列向量拼接
使用逗号进行分隔,新矩阵B = [A,v],注意维数要相符合。
A =
1 2 3
4 5 6
7 8 9
>> v = [11,12,13]';B = [A,v]
B =
1 2 3 11
4 5 6 12
7 8 9 13
3.习题一道
在任意矩阵A的第二列和第三列之间插入列向量v。
五、向量/矩阵的代数运算
1.转置
在本章第一部分的向量中已经介绍了转置符号,还有独立的函数transpose()来转置,用的很少就是了,二者效果是一样的。
A =
1 2 3
4 5 6
7 8 9
>> B = A'
B =
1 4 7
2 5 8
3 6 9
>> C = transpose(A)
C =
1 4 7
2 5 8
3 6 9
2.加减法运算
直接相加减,像现实一样,注意向量或者矩阵的维数要相同。
3.矩阵的数乘
直接乘,要求前一个矩阵的列数和下一个矩阵的行数相等,其余规则类似于C语言,为了方便与点乘区分,这里放一块代码。
>> A = rand(3,4);B = rand(4,5);C = A*B
C =
0.9268 1.0472 1.2190 0.3052 0.8759
0.3645 0.9114 0.8051 0.3273 1.2485
1.2721 1.3841 1.4832 0.4615 1.2813
4.矩阵的翻转(使用函数)
1.左右翻转:fliplr(A)即对A进行左右翻转;
2.上下翻转:flipud(A);
3.逆时针旋转90度:rot90(A);
5.矩阵的乘方运算
即矩阵A的n次方,输入B=A^n。
6.矩阵的点运算
和数乘的基本规则不同,点运算是对应位置元素直接运算。主要分为点加减,点除和点乘和点方(表示矩阵每一位的数各自平方。格式为:A.^2)。基本格式为C = A.+(+可以由其他运算符代替)B。例如,点乘运算为两个矩阵的对应元素两两相乘。但是要注意,两个矩阵维数要完全相同,否则会报错。这里以点乘为例:
>> A = rand(3);B = rand(3);C = A.*B
C =
0.2047 0.4633 0.1174
0.2596 0.3796 0.0416
0.0174 0.0373 0.1655
六、矩阵的逻辑运算(基本和C语言的逻辑运算方式相同,表达式稍有不同)
1.矩阵的与运算
用符号&表示矩阵的与运算,A&B表示对A和B相应元素进行与运算(显然二者的维数要相同),如果两个相应元素均非0,则对应位置与运算结果为1,否则为0。
>> A
A =
1 0 1
0 1 1
2 1 0
>> B
B =
2 2 0
0 1 1
0 1 0
>> C = A&B
C =
3×3 logical 数组
1 0 0
0 1 1
0 1 0
2.矩阵的或运算
如果两个相应元素存在非0值,则这两个元素与运算的结果为1,否则为0。该运算符号为“|”。学习者自行尝试,不再放入代码。
3.矩阵的非运算
如果元素为0,非运算结果为1,如果不为0,非运算结果为0,这个运算是一元的,符号为“~”
>> A
A =
1 0 1
0 1 1
2 1 0
>> C = ~A
C =
3×3 logical 数组
0 1 0
1 0 0
0 0 1
4.矩阵的异或运算
xor(A,B)表示A和B相应元素的异或运算,如果两个相应元素一个为0,一个非0,则这两个元素异或运算的结果为1,否则为0。
>> A
A =
1 0 1
0 1 1
2 1 0
>> B
B =
2 2 0
0 1 1
0 1 0
>> C = xor(A,B)
C =
3×3 logical 数组
0 1 1
0 0 0
1 0 0
七、矩阵的比较运算及数值查询
1.比较运算符号
大于>,小于<,等于==,大于等于>=,小于等于<=,不等于~=。
不同比较运算符可以混合使用:譬如C=A>=B,如果A的对应值大于B的对应值,对C的对应值赋值为1,否则赋值为0。可见比较运算可以作为逻辑运算的补充。
2.矩阵比较运算用法
常与find()函数配合使用,find()函数可以用于查询出满足某关系的数组下标。例如:[m,n]=find(A>=5),可以找出矩阵A中大于等于5的元素的位置,满足条件元素的行下标存储在向量m中,列下标存储在向量n中,运行示例如图:
A =
1 2 3
4 5 6
7 8 9
>> [m,n] = find(A>=5)
m =
3
2
3
2
3
n =
1
2
2
3
3
还可以用[m,n]=find(is某个字符(A)),给出A中元素和该字符相符的元素的下标。
八、矩阵分析
1.行列式
det(A),直接获取A的行列式
>> A
A =
1 2 3
4 5 6
7 8 9
>> a = det(A)
a =
-9.5162e-16
2.矩阵的迹
对角元素之和。使用函数trace(A)来生成,当然也可以提取子元素暴力相加。
A =
1 2 3
4 5 6
7 8 9
>> a = trace(A)
a =
15
3.矩阵的秩
矩阵中线性无关向量的最大个数。用函数rank(A)来获取。
4.矩阵的逆
利用函数inv(A)求解矩阵A的逆矩阵。
A =
1 2 3
4 5 6
7 8 9
>> B = inv(A)
B =
1.0e+16 *
0.3153 -0.6305 0.3153
-0.6305 1.2610 -0.6305
0.3153 -0.6305 0.3153
5.特征值与特征向量
利用函数[V,D]=eig(A)来求解矩阵A的特征值和特征向量,其中D为对角矩阵,对角线元素即为A的特征值,矩阵V的各列即为各特征值对应的特征向量。
A =
1 2 3
4 5 6
7 8 9
>> [V,D] = eig(A)
V =
-0.2320 -0.7858 0.4082
-0.5253 -0.0868 -0.8165
-0.8187 0.6123 0.4082
D =
16.1168 0 0
0 -1.1168 0
0 0 -0.0000
九、复数的生成与矩阵详解
第一章简单介绍过matlab中复数的表示方式:和现实中一样。倘若需要一个复数矩阵,一点一点输入多个实部和虚部数据太过于繁琐。在后来我在矩阵这一章对这一部分做出了补充:
首先要补充一个非常重要的函数:complex(x,y),x和y分别为复数的实部和虚部,可以用这个函数来生成一个复数,如代码块所示:
>> x = complex(1,2)
x =
1.0000 + 2.0000i
所以呢,我们可以适当联想,x和y处的数据不单单可以是数据,还可以是小数或者整数矩阵(当然啦,x和y矩阵的维数必须相同,不然“穿不到一条裤子里”):
>> x = [1,2,3;4,5,6;7,8,9];
>> y = [0.1,0.2,0.3;0.4,0.5,0.6;0.7,0.8,0.9];
>> z = complex(x,y)
z =
列 1 至 2
1.0000 + 0.1000i 2.0000 + 0.2000i 3.0000 + 0.3000i
4.0000 + 0.4000i 5.0000 + 0.5000i 6.0000 + 0.6000i
7.0000 + 0.7000i 8.0000 + 0.8000i 9.0000 + 0.9000i
本章的内容到此结束,倘若你有问题,请及时在评论区留言反馈。下章预告:基础图像绘制。倘若你觉得写得不错,可以关注我或者收藏本系列,只要有空就会更新下去的哦!!!!文章来源:https://www.toymoban.com/news/detail-834027.html
本章节更新记录
2024.2.14首次发布。
2024.2.14优化了排版方式,更加便于查阅。
2024.2.15补充了复数矩阵的生成方式
[1]:参考文献:Matlab官网Mathworks-帮助中心文章来源地址https://www.toymoban.com/news/detail-834027.html
到了这里,关于【Matlab入门】 第二章 向量和矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!