MATLAB矩阵分析与处理
1.特殊矩阵
通用的特殊矩阵
zeros:产生全0矩阵(零矩阵)
ones:产生全1矩阵(1矩阵)
eye:产生单位矩阵
rand:产生0~1间均匀分布的随机矩阵
randn:产生均值为0,方差为1的标准正态分布随机矩阵
用于专门学科的特殊矩阵
1)魔方矩阵
魔方矩阵的每行、每列及两条对角线上的元素之和都相等。
>> magic(5)
ans =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
>> magic(4)
ans =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
2)范德蒙德(Vandermonde)矩阵
A =
1 1 1 1
8 4 2 1
27 9 3 1
125 25 5 1
范德蒙德矩阵其最后一列全为1,倒数第二列为一个指定的向量,其他各列是其其后列与倒数第二列的点乘积。可以用一个指定向量生成一个范德蒙德矩阵。在MATLAB中,函数vander(V)生成以向量V为基础向量的范德蒙德矩阵。
A= vander([1;2;3;5])
3)希尔伯特(Hilbert)矩阵
希尔伯特矩阵的每个元素h(ij) = 1/(i+j-1)。在MATLAB中生成希尔伯特矩阵的函数是hilb(n)。希尔伯特矩阵是一个条件数很差的矩阵,使用一般方法求逆会因为原始数据的微小扰动而产生不可靠的计算结果。在MATLAB中,有一个专门求希尔伯特矩阵的逆的函数invhilb(n),其功能是求n阶的希尔伯特矩阵的逆矩阵。
format rat %以有理形式输出
H = hilb(4)
H = invhilb(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
H =
16 -120 240 -140
-120 1200 -2700 1680
240 -2700 6480 -4200
-140 1680 -4200 2800
4)特普利茨(Toeplitz)矩阵
特普利茨矩阵除第一行和第一列外,其他每个元素都与左上角的元素相同。
toeplize(x,y)生成一个以x为第一列,y为第一行的特普利茨矩阵,x,y均为向量且不必等长
toeplitz(x)用向量x生成一个对称的特普利茨矩阵。
>> T = toeplitz(1:6)
T =
1 2 3 4 5 6
2 1 2 3 4 5
3 2 1 2 3 4
4 3 2 1 2 3
5 4 3 2 1 2
6 5 4 3 2 1
5)伴随矩阵
MATLAB生成伴随矩阵的函数是compan§,其中p是一个多项式的系数向量,高次幂系数排在前,低次幂排在后。例如求 x^3 - 7x + 6 的伴随矩阵。
>> p = [1,0,-7,-6];
>> compan(p)
ans =
0 7 6
1 0 0
0 1 0
6)帕斯卡(Pascal)矩阵
二次项 (x + y)^n 展开后的系数随n的增大组成一个三角形表,称为杨辉三角。由杨辉三角形组成的矩阵称为帕斯卡矩阵。
【例】求(x + y)^5的展开式
>> pascal(6)
ans =
1 1 1 1 1 1
1 2 3 4 5 6
1 3 6 10 15 21
1 4 10 20 35 56
1 5 15 35 70 126
1 6 21 56 126 252
矩阵次对角线上的元素1、5、10、10、5、1即为展开式的系数。
2.矩阵结构变换
对角阵
只有对角线上有非0元素的矩阵称为对角矩阵,对角线上的元素相等的对角矩阵称为数量矩阵,对角线上的元素都为1的对角矩阵称为单位矩阵。
1)提取矩阵的对角线元素
设A为m * n矩阵,diag(A)函数用于提取矩阵A主对角线元素,产生一个具有min(m,n)个元素的列向量。
>> A = [1,2,3;4,5,6];
>> D = diag(A)
D =
1
5
diag(A,k):提取第k条对角线的元素。主对角线为第0条对角线,与主对角线平行,往上+1,往下-1。
>> A = [1,2,3;4,5,6];
>> D1 = diag(A,1)
D1 =
2
6
2)构造对角矩阵
设V为具有m个元素的向量,diag(V)将产生一个m * m对角矩阵,其主对角线元素即为向量V的元素。
>> diag([1,2,-1,4])
ans =
1 0 0 0
0 2 0 0
0 0 -1 0
0 0 0 4
diag(V,k):产生一个n * n(n = m + |k|)的对角阵,其第k条对角线即为向量V的元素。
>> diag(1:3,-1)
ans =
0 0 0 0
1 0 0 0
0 2 0 0
0 0 3 0
三角阵
1)上三角阵
triu(A)
>> A = [1,32,-28;2,-9,8;0,34,5];
>> B = triu(A)
B =
1 32 -28
0 -9 8
0 0 5
triu(A,k):求矩阵A的第k条对角线以上的元素。
>> A = [1,32,1,0,5;3,5,17,4,16;4,0,-13,0,42;70,11,9,21,3;11,63,5,2,99];
>> B = triu(A,2)
B =
0 0 1 0 5
0 0 0 4 16
0 0 0 0 42
0 0 0 0 0
0 0 0 0 0
2)下三角矩阵
tril(A)
tril(A,k)
矩阵的转置与旋转
1)矩阵的转置
转置运算符是单撇号( ')
2)矩阵的旋转
rot(A,k):将矩阵A逆时针旋转90°的k倍,当k为1时可省略。
3)矩阵的左右翻转
fliplr(A)
4)矩阵的上下翻转
flipud(A)
3.矩阵求逆与线性方程组求解
矩阵的逆与伪逆
求逆:inv(A)。
如果矩阵A不是一个方阵,或者A是一个非满秩的方阵时,矩阵A没有逆矩阵,但可以找到一个与A的转置矩阵A’同型的矩阵B,使得:
A * B * A = A
B * A * B = B
此时称矩阵B为矩阵A的伪逆,也称广义逆矩阵。在MATLAB中可用pinv(A)
>> A = [3,1,1,1;1,3,1,1;1,1,3,1];
>> B = pinv(A)
B =
11/28 -3/28 -3/28
-3/28 11/28 -3/28
-3/28 -3/28 11/28
1/28 1/28 1/28
若A是一个奇异矩阵,无一般意义上的逆矩阵,但可以求A的伪逆矩阵。
>> A = [0,0,0;0,1,0;0,0,1];
>> pinv(A)
ans =
0 0 0
0 1 0
0 0 1
用矩阵求逆方法求解线性方程组
求逆函数以及左除运算符
4.矩阵求值
1)方阵的行列式
det(A)
>> A = rand(5)
A =
302/461 547/1607 637/1259 131/945 13088/16073
655/4028 580/991 1287/1841 222/1487 771/3166
1078/9059 438/1957 2752/3089 463/1798 959/1032
457/917 1927/2565 542/565 797/948 1079/3083
1049/1093 388/1521 226/413 193/759 358/1821
>> B = det(A)
B =
-241/1859
2)矩阵的秩与迹
矩阵的秩
rank(A)
>> A = [2,2,-1,1;4,3,-1,2;8,5,-3,4;3,3,-2,2]
A =
2 2 -1 1
4 3 -1 2
8 5 -3 4
3 3 -2 2
>> A = [2,2,-1,1;4,3,-1,2;8,5,-3,4;3,3,-2,2];
>> r = rank(A)
r =
4
矩阵的迹
矩阵的迹等于矩阵对角线元素之和,也等于矩阵的特征值之和。
trance(A)
>> A = [2,2,-1,1;4,3,-1,2;8,5,-3,4;3,3,-2,2];
>> trace(A)
ans =
4
3)向量和矩阵的范数
矩阵或向量的范数用来度量矩阵或向量在某种意义下的长度
范数讲解
设向量 V = (v1,v2,…,vn)
在MATLAB中,求这3种向量范数的函数分别为:
1.norm(V)或norm(V,2):计算向量V的2-范数
2.norm(V,1):计算向量V的1-范数
3.norm(V,inf):计算向量V的∞-范数
4)矩阵的条件数
在求解线性方程组AX = b时,一般认为,系数矩阵A中个别元素的微小扰动不会引起解向量的很大变化。此假设可得出结论:当参与运算的系数与实际精确值误差很小时,所获得的解与问题的准确解误差也很小。可是上述假设并不总是正确,对于有的系数矩阵,个别元素的微小矩阵会引起解的很大变化,在计算数学中,称这种矩阵是病态矩阵,而称解不因系数矩阵的微小扰动而发生大的变化的矩阵为良性矩阵。良性与病态是相对的,需要一个参数来描述,条件数就是用来描述矩阵这种性能的一个参数。
矩阵A的条件数等于A的范数与A的逆矩阵的范数的乘积,即cond(A) = ||A||*||A^-1||。这样定义的条件数总是大于1的。条件数越接近1,矩阵的性能越好,反之,矩阵的性能越差。A有3种范数,相应地可定义3种条件数。
1.cond(A,1):计算A的1-范数下的条件数
2.cond(A)或cond(A,2):计算A的2-范数下的条件数
3.cond(A,inf):计算A的∞-范数下的条件数
>> A = [2,2,-1,1;4,3,-1,2;8,5,-3,4;3,3,-2,2];
>> trace(A)
ans =
4
>> A = [2,2,3;4,5,-6;7,8,9];
>> c1 = cond(A)
c1 =
87.9754
>> B = [2,-5,4;1,5,-2;-1,2,4];
>> c2 = cond(B)
c2 =
3.7515
矩阵B的条件数比矩阵A的条件数更接近1,因此,矩阵B的性能要好于矩阵A。
5.矩阵的特征值与特征向量
d = eig(A):求矩阵A的全部特征值,构成向量d。
[V,D] = eig(A):求矩阵A全部特征值,构成对角阵D,并求A的特征向量构成V的列向量。
[V,D] = eig(A,‘nobalance’):直接求A的特征值与特征向量。
d = eig(A,B):求矩阵A与矩阵B的特征值,且A、B为方阵。
[V,D] = eig(A,B):求方阵A、B的特征值,构成对角阵D,并求特征向量构成V的列向量,并且A * V = B * V * D。
【例】用求特征值的方法解方程 3X^5 - 7X^4 + 5X^2 + 2X - 18 = 0
先构造与方程对应的多项式的伴随矩阵A,再求A的特征值。A的特征值即为方程的根
p = [3,-7,0,5,2,-18]
A = compan(p) %A的伴随矩阵
x1 = eig(A) %求A的特征值
x2 = roots(p) %直接求多项式p的零点
x1 =
5160/2363 + 0i
1 + 1i
1 - 1i
-1397/1510 + 670/931i
-1397/1510 - 670/931i
x2 =
5160/2363 + 0i
1 + 1i
1 - 1i
-1397/1510 + 670/931i
-1397/1510 - 670/931i
6.矩阵的超越函数
MATLAB提供了一些直接作用于矩阵的超越函数,这些函数名都在上述内部函数名之后缀以m,并规定输入参数A必须是方阵。
1)矩阵平方根函数sqrtm
>> A = [4,2;3,6];
>> B = sqrtm(A)
B =
1018/531 728/1565
1092/1565 1751/735
2)矩阵对数logm
>> A = [4,9;1,5];
>> L = logm(A)
L =
949/892 1529/629
289/1070 2017/1512
3)矩阵指数expm
>> B = expm(L)
B =
4 9
1 5
4)通用矩阵函数funm
funm(A,‘fun’)对方阵A计算由fun定义的函数的矩阵函数值。例如,当fun取exp时,funm(A,‘exp’)可以计算矩阵A的指数,与expm(A)的计算结果一样。
>> A = [2,-1;1,0]
A =
2 -1
1 0
>> funm(A,'exp')
ans =
1457/268 -1457/536
1457/536 *
>> expm(A)
ans =
1457/268 -1457/536
1457/536 0