/ 写在前面 – 我热爱技术、热爱开源。我也相信开源能使技术变得更好、共享能使知识传播得更远。但是开源并不意味着某些商业机构/个人可以为了自身的利益而一味地索取,甚至直接剽窃大家曾为之辛勤付出的知识成果,所以本文未经允许,不得转载,谢谢。/
特殊矩阵
通用特殊矩阵
zeros
函数,产生全0矩阵。ons
函数,产生全1矩阵。eye
函数,产生对角线为1的矩阵。当矩阵是方阵时,得到一个单位矩阵。rand
函数,产生(0,1)区间均匀分布的随机矩阵,不包括0和1。randn
函数,产生均值为0,方差为1的标准正态分布随机矩阵,n代表normal,即正态分布。
这几个函数调用方法类似,以 zeros
为例:
>> A=[1,2,3,4;5,6,7,8;9,10,11,12]
A =
1 2 3 4
5 6 7 8
9 10 11 12
>> size(A)
ans =
3 4
>> zeros(3)
ans =
0 0 0
0 0 0
0 0 0
>> zeros(3,4)
ans =
0 0 0 0
0 0 0 0
0 0 0 0
>> zeros(size(A))
ans =
0 0 0 0
0 0 0 0
0 0 0 0
那么,要得到两位随机整数,即[10, 99],故我们的取值范围就要在(10, 100),可得下面的这个演化过程:
- (0, 1)
- (0, 1) * 90 = (0, 90)
- (0, 90) + 10 = (10, 100)
- 然后对(10, 100)进行
fix
取整即可
所以,我们可以通过上面这个过程,看到 a = 10, b = 99
,故 b - a + 1 = 90
。
>> A=fix(10+90*rand(5));
>> B=0.6+sqrt(0.1)*randn(5);
>> I=eye(5);
>> (A+B)*I==I*A+B*I
ans =
5×5 logical array
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
用于专门学科的特殊矩阵
魔方矩阵 - Magic Square
使用 magic
函数产生魔方矩阵:
>> M=magic(3)
M =
8 1 6
3 5 7
4 9 2
范德蒙矩阵 - Vandermonde Matrix
在MATLAB中,函数 vander(V)
生成以向量 V
为基础的范德蒙矩阵:
>> A=vander(1:5)
A =
1 1 1 1 1
16 8 4 2 1
81 27 9 3 1
256 64 16 4 1
625 125 25 5 1
范德蒙矩阵常用在各种通信系统的纠错编码中,例如,常用的Reed-Solomon编码即以范德蒙矩阵为基础。
希尔伯特矩阵 - Hilbert Matrix
希尔伯特矩阵的元素为。
在MATLAB中,生成n阶Hilbert Matrix的函数是 hilb(n)
:
>> format rat% 设置输出格式为以有理数形式输出
>> H=hilb(4)
H =
1 1/2 1/3 1/4
1/2 1/3 1/4 1/5
1/3 1/4 1/5 1/6
1/4 1/5 1/6 1/7
希尔伯特矩阵是著名的病态矩阵,即任何一个元素发生较小的变动,整个矩阵的值和逆矩阵都会发生很大的变化,病态程度和矩阵的阶数相关,随着阶数的增加,病态更加严重。
伴随矩阵 - Adjugate Matrix
MATLAB生成伴随矩阵的函数是 compan(p)
,其中 p
是一个多项式的系数向量,高次幂系数排在前,低次幂系数排在后。
例如,生成多项式的伴随矩阵:
>> p=[1,-2,-5,6];
>> A=compan(p)
A =
2 5 -6
1 0 0
0 1 0
伴随矩阵的特征值等于多项式方程的根。
帕斯卡矩阵 - Pascal Matrix
根据二项式定理,展开后的系数随着n的增大组成一个三角形表,这个三角形称为杨辉三角形。
把二项式系数依次填写在矩阵的左侧对角线上,然后提取左侧的n行n列元素即为n阶帕斯卡矩阵。
函数 pascal(n)
可以生成一个n阶帕斯卡矩阵。
矩阵变换
对角阵
几个定义:
- 对角矩阵:只有对角线上有非零元素的矩阵。
- 数量矩阵:对角线上的元素相等的对角矩阵。
- 单位矩阵:对角线上的元素都为1的对角矩阵。
提取矩阵的对角线元素:
diag(A)
:提取矩阵A主对角线元素,产生一个列向量。diag(A,k)
:提取矩阵A第k条对角线的元素,产生一个列向量。
关于矩阵对角线的条数的定义见下图:
构造对角矩阵:
diag(V)
:以向量V
为主对角线元素,产生对角矩阵。diag(V,k)
:以向量V
为第k条对角线元素,产生对角矩阵。
三角阵
几个定义:
- 上三角阵:矩阵的对角线以下的元素全为0的矩阵。
- 下三角阵:对角线以上的元素全为0的矩阵。
triu
函数用来求上三角矩阵,其中的u代表up,该函数有2种调用形式:
triu(A)
:提取矩阵A的主对角线及以上的元素。triu(A,k)
:提取矩阵A的第k条对角线及以上的元素。
tril
函数用来求下三角矩阵,其中的l代表low,该函数有2种调用形式,与 triu
函数完全相同。
矩阵的转置
转置运算符是小数点后面接单引号 .'
。
还有一种转置是共轭转置,其运算符是单引号 '
,它在转置的基础上还要取每个数的复共轭。
如果A是一个复数矩阵,那么转置运算和共轭转置的结果是不一样的。如果矩阵的元素是实数,那么转置和共轭转置的结果是一样的。
>> A=[1,2;3,4]
A =
1 2
3 4
>> A.'
ans =
1 3
2 4
矩阵的旋转
函数 rot90(A,k)
将矩阵A逆时针方向旋转90°的k倍,当k为1时可省略。
矩阵的翻转
对矩阵实施左右翻转,是将原矩阵的第一列和最后一列调换,第二列和倒数第二列调换,依次类推。
函数 fliplr(A)
可以对矩阵A实施左右翻转。
同理 ,我们还可以对矩阵实施上下翻转,其函数为 flipud(A)
。
矩阵求逆
函数 inv(A)
可以求方阵A的逆矩阵,前提是它有逆矩阵。
矩阵求值
矩阵的行列式值(Determinant)
如果矩阵是方形矩阵,则代表矩阵的行列式值。
函数 det(A)
可以求方阵A所对应的行列式的值。
矩阵的秩(Rank)
矩阵线性无关的行数或列数称为矩阵的秩。
函数 rank(A)
可以求矩阵A的秩。
矩阵的迹(Trace)
矩阵的迹等于矩阵的对角线元素之和,也等于矩阵的特征值之和。
函数 trace(A)
可以求矩阵A的迹。
向量和矩阵的范数
矩阵或向量的范数用来度量矩阵或向量在某种意义下的长度。范数有多种定义,其定义不同,范数的值也就不同。
向量的3种常用范数:
- 向量1-范数:向量元素的绝对值之和。
- 向量2-范数:向量元素绝对值的平方和的平方根。
- 向量∞-范数:所有向量元素绝对值种的最大值。
在MATLAB种,求向量范数的函数为:
norm(V)
或norm(V,2)
:计算向量V的2-范数。norm(V,1)
:计算向量V的1-范数。norm(V,inf)
:计算向量V的∞-范数。
矩阵的范数:
- 矩阵A的1-范数:所有矩阵列元素绝对值之和的最大值。
- 矩阵A的2-范数:矩阵的最大特征值的平方根。
其中为的最大特征值。
- 矩阵A的∞-范数:所有矩阵行元素绝对值之和的最大值。
MATLAB提供了求3种矩阵范数的函数,其函数调用格式与求向量的范数的函数完全相同。
矩阵的条件数
矩阵A的条件数等于A的范数与A的逆矩阵的范数的乘积。
条件数越接近于1,矩阵的性能越好,反之,矩阵的性能越差。
在MATLAB中,计算矩阵A的3种条件数的函数是:
cond(A,1)
:计算A的1-范数下的条件数。cond(A)
或cond(A,2)
:计算A的2-范数下的条件数。cond(A,inf)
:计算A的∞-范数下的条件数。
矩阵的特征值与特征向量
矩阵特征值的数学定义:设A是n阶方阵,如果存在常数λ和n维非零列向量x,使得等式成立,则称λ为A的特征值,x是对应特征值λ的特征向量
函数调用格式有2种:
E=eig(A)
:求矩阵A的全部特征值,构成向量E。[X,D]=eig(A)
:求矩阵A的全部特征值,构成对角阵D,并产生矩阵X,X各列是相应的特征向量。
矩阵的特征值和特征向量是线性代数理论中的重要概念,在科学研究与工程实践中,有很广泛的应用,许多实际问题的求解最终归结为求矩阵的特征值与特征向量,如工程中的振动问题、动力系统的稳定性问题等。
稀疏矩阵
稀疏矩阵是指零元素的个数远远多于非零元素的个数的矩阵。MATLAB为稀疏矩阵提供了方便有效的存储方式。
在MATLAB中,矩阵的存储方式有:
- 完全存储方式:将矩阵的全部元素按列存储。
- 稀疏存储方式:只存储矩阵的非零元素的值及其位置,即行号和列号。
注意,采用稀疏存储方式时,矩阵元素的存储顺序并没有改变,也是按列的顺序进行存储。
完全存储方式与稀疏存储方式之间的转化
A=sparse(S)
:将矩阵S转化为稀疏存储方式的矩阵A。S=full(A)
:将矩阵A转换为完全存储方式的矩阵S。
直接建立稀疏存储矩阵
对于超大的稀疏矩阵,先建立完全存储方式的矩阵,然后再进行转化是不可取的,所以MATLAB提供了直接建立稀疏存储矩阵的方式:
sparse(m,n)
:生成一个m×n的所有元素都是0的稀疏矩阵。sparse(u,v,S)
:其中u、v、S是3个等长的向量。S是要建立的稀疏存储矩阵的非零元素,u(i)
、v(i)
分别是S(i)
的行和列下标。
使用 spconvert
函数直接建立稀疏存储矩阵,其调用格式为: B=spconvert(A)
,其中A为一个m×3或m×4的矩阵,其每行表示一个非零元素,m是非零元素的个数。
A(i,1)
表示第i个非零元素所在的行。A(i,2)
表示第i个非零元素所在的列。A(i,3)
表示第i个非零元素值的实部。A(i,4)
表示第i个非零元素值的虚部。
带状稀疏矩阵的稀疏存储
稀疏矩阵有两种基本类型:
- 无规则结构的稀疏矩阵
- 有规则结构的稀疏矩阵
带状稀疏矩阵就是一种十分典型的具有规则结构的稀疏矩阵,它是指所有非零元素集中在对角线上的矩阵。所以有:
[B,d]=spdiags(A)
:从带状稀疏矩阵A中提取全部非零对角线元素赋给矩阵B及其这些非零对角线的位置向量d。A=spdiags(B,d,m,n)
:产生带状稀疏矩阵的稀疏存储矩阵A,其中m、n为原带状稀疏矩阵的行数与列数,矩阵B的第i列即为原带状稀疏矩阵的第i条非零对角线,向量d为原带状稀疏矩阵所有非零对角线的位置。
>> A=[11,0,0,12,0,0;0,21,0,0,22,0;0,0,31,0,0,32;41,0,0,42,0,0;0,51,0,0,52,0]
A =
11 0 0 12 0 0
0 21 0 0 22 0
0 0 31 0 0 32
41 0 0 42 0 0
0 51 0 0 52 0
>> [B,d]=spdiags(A)
B =
0 11 12
0 21 22
0 31 32
41 42 0
51 52 0
d =
-3
0
3
单位矩阵的稀疏存储
speye(m,n)
返回一个m×n的稀疏存储单位矩阵。