3.2 矩阵操作
3.2.1 创建矩阵
除了在之前章节提到的零矩阵、单位矩阵和全1矩阵等特殊矩阵,MATLAB中还有一些指令用于生成试验矩阵。表3-1给出了MATLAB中其他特殊矩阵的指令集。
表3-1 MATLAB中其他特殊矩阵的指令集
1.希尔伯特(Hilbert)矩阵
希尔伯特矩阵,也称H阵,其元素为Hij=1/(i+j-1)。由于它是一个条件数差的矩阵,所以将它用来作为试验矩阵。
关于希尔伯特矩阵的指令函数如下。
● hilb(n):用于生成一个n×n的希尔伯特矩阵。
● invhilb(n):用于生成一个n×n的希尔伯特矩阵的逆矩阵整数矩阵。
例3-14:希尔伯特矩阵生成示例。
在命令行窗口中输入:
A = hilb(3)
输出结果:
A = 1.0000 0.5000 0.3333 0.5000 0.3333 0.2500 0.3333 0.2500 0.2000
在命令行窗口中输入:
B = invhilb(3)
输出结果:
B = 9 -36 30 -36 192 -180 30 -180 180
从结果中可以看出,希尔伯特矩阵和它的逆矩阵都是对称矩阵。
2.托普利兹(Toeplitz)矩阵
另外一个比较重要的矩阵为托普利兹矩阵,它由两个向量定义,即一个行向量和一个列向量。对称的托普利兹矩阵由单一向量来定义。
关于托普利兹矩阵的指令函数如下。
● toeplitz(k,r):用于生成非对称托普利兹矩阵,第1列为k,第1行为r,其余元素等于其左上角元素。
● toeplitz(c):用于用向量c生成一个对称的托普利兹矩阵。
例3-15:托普利兹矩阵函数示例。
在命令行窗口中输入:
C = toeplitz(2 : 5 , 2 : 2 : 8)
输出结果:
C = 2 4 6 8 3 2 4 6 4 3 2 4 5 4 3 2
3.0~1间均匀分布的随机矩阵
在MATLAB中常用rand()函数产生0~1间均匀分布的随机矩阵,其调用格式如下。
● r=rand(n):产生n行n列的0~1间均匀分布的随机矩阵。
● r=rand(m,n):产生m行n列的0~1间均匀分布的随机矩阵。
● r=rand(m,n,p,...):产生维数为m×n×p的0~1间均匀分布的随机矩阵。
● r=rand(size(A)):产生一个与矩阵A维数相同的0~1间均匀分布的随机矩阵。
例3-16:创建0~1间均匀分布的随机矩阵示例。
在命令行窗口中依次输入:
clear all B = rand(3) C = rand([3,4]) D = rand(size(C))
输出结果:
B = 0.0975 0.9575 0.9706 0.2785 0.9649 0.9572 0.5469 0.1576 0.4854 C = 0.8003 0.9157 0.6557 0.9340 0.1419 0.7922 0.0357 0.6787 0.4218 0.9595 0.8491 0.7577 D = 0.7431 0.1712 0.2769 0.8235 0.3922 0.7060 0.0462 0.6948 0.6555 0.0318 0.0971 0.3171
4.标准正态分布随机矩阵
在MATLAB中常用randn()函数产生均值为0、方差为1的随机矩阵,其调用格式如下。
● r=randn(n)。
● r=randn(m,n)。
● r=randn(m,n,p,...)。
● r=randn([m,n,p,...])。
● r=randn(size(A))。
其格式可参考上述rand()函数。
例3-17:创建标准正态分布随机矩阵示例。
在命令行窗口中依次输入:
clear all B = randn(3) C = randn([3,4]) D = randn(size(C))
输出结果:
B = -0.5445 0.4900 -0.1941 0.3035 0.7394 -2.1384 -0.6003 1.7119 -0.8396 C = 1.3546 0.1240 -0.1977 0.8252 -1.0722 1.4367 -1.2078 1.3790 0.9610 -1.9609 2.9080 -1.0582 D = -0.4686 -0.2779 -0.3538 0.5080 -0.2725 0.7015 -0.8236 0.2820 1.0984 -2.0518 -1.5771 0.0335
5.魔方矩阵
在MATLAB中常用magic()函数产生魔方矩阵。魔方矩阵中每行、每列和两条对角线上的元素和相等,其调用格式如下。
● M=magic(n)。
例3-18:创建魔方矩阵示例。
在命令行窗口中依次输入:
clear all A = magic(3) B = magic(4) C = magic(5) E = sum(A) % 计算每行的和 F = sum(A') % 计算每列的和
输出结果:
A = 8 1 6 3 5 7 4 9 2 B = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 C = 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 E = 15 15 15 F = 15 15 15
6.帕斯卡矩阵
在MATLAB中常用pascal()函数产生帕斯卡矩阵,其调用格式如下。
● A=pascal(n):返回n阶的对称正定Pascal矩阵,其中的元素是由Pascal三角组成的,其逆矩阵的元素都是整数。
● A=pascal(n,1):返回由下三角的Cholesky因子组成的Pascal矩阵,它是对称的,所以它是自己的逆。
● A=pascal(n,2):返回pascal(n,1)的转置和交换形式。A是单位矩阵的立方根。
例3-19:创建帕斯卡矩阵示例。
在命令行窗口中依次输入:
clear all A = pascal(4) % 创建4阶帕斯卡矩阵 B = pascal(3,1) C = pascal(3,2)
输出结果:
A = 1 1 1 1 1 2 3 4 1 3 6 10 1 4 10 20 B = 1 0 0 1 -1 0 1 -2 1 C = 1 1 1 -2 -1 0 1 0 0
7.范德蒙(Vandermonde)矩阵
在MATLAB中常用vander()函数产生范德蒙矩阵,其调用格式如下。
● A=vander(v):生成范德蒙矩阵,矩阵的列是向量v的幂,即A(i,j)=v(i)^(n-j),其中n=length(v)。
例3-20:生成范德蒙矩阵示例。
在命令行窗口中依次输入:
clear all A = vander([1 2 3 4]) B = vander([1;2;3;4]) C = vander(1:.5:3)
输出结果:
A = 1 1 1 1 8 4 2 1 27 9 3 1 64 16 4 1 B = 1 1 1 1 8 4 2 1 27 9 3 1 64 16 4 1 C = 1.0000 1.0000 1.0000 1.0000 1.0000 5.0625 3.3750 2.2500 1.5000 1.0000 16.0000 8.0000 4.0000 2.0000 1.0000 39.0625 15.6250 6.2500 2.5000 1.0000 81.0000 27.0000 9.0000 3.0000 1.0000
注意:使用vander()函数产生范德蒙矩阵,输入向量可以是行向量或列向量。
3.2.2 改变矩阵大小
1.矩阵的合并
矩阵的合并就是把两个或者两个以上的矩阵数据连接起来得到一个新的矩阵。针对二维矩阵A、B:
(1)[A,B]表示按列存储合并矩阵,即将B矩阵接到A矩阵的列后面;[A;B]表示按行存储合并矩阵,即将B矩阵接到A矩阵的行后面。
(2)cat(1,A,B)表示[A;B],即以行存储;cat(2,A,B)同[A,B];cat(3,A,B)表示以第3维组合A、B,组合后变成三维矩阵。
注意:前面介绍的矩阵构造符[]不仅可用于构造矩阵,同时还可以作为一个矩阵合并操作符。表达式C=[A B]在水平方向上合并矩阵A和B,而表达式C=[A;B]在竖直方向上合并矩阵A和B。
例3-21:合并矩阵示例一。
在命令行窗口中输入:
clear all a = ones(3,4) b = zeros(3,4) c = [a;b] % 当采用;时,上下合并拼接矩阵
输出结果:
a = 1 1 1 1 1 1 1 1 1 1 1 1 b = 0 0 0 0 0 0 0 0 0 0 0 0 c = 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
例3-22:合并矩阵示例二。
在命令行窗口中输入:
clear all a = ones(3,4); b = zeros(3,4); c = [a b] % 当采用空格时,左右合并拼接矩阵 d = [b,a] % 当采用,时,左右合并拼接矩阵
输出结果:
c = 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 d = 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
例3-23:合并矩阵示例三。
在命令行窗口中输入:
clear all a = ones(3,4); b = zeros(3,4); c = cat(1,a,b) d = cat(2,a,b)
输出结果:
c = 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 d = 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0
可以用矩阵合并符来构造任意大小的矩阵。不过需要注意的是,在矩阵合并的过程中一定要保持矩阵的形状是方形,否则矩阵合并将无法进行。
图3-1表明具有相同高度的两个矩阵可以在水平方向上合并为一个新的矩阵。而图3-2则表明不具有相同高度的两个矩阵不允许合并为一个矩阵。
图3-1 正确的矩阵合并
图3-2 不正确的矩阵合并
除了使用矩阵合并符“[]”来合并矩阵,还可以使用矩阵合并函数来合并矩阵。这些矩阵合并函数如表3-1所示。
2.矩阵行列的删除
要删除矩阵的某一行或某一列,只要将该行或该列赋予一个空矩阵“[]”即可。例如有一个4×4的随机矩阵,代码设置如下:
A = rand(4,4)
上述语句得到矩阵A:
A = 0.1450 0.5132 0.1233 0.0497 0.8530 0.4018 0.1839 0.9027 0.6221 0.0760 0.2400 0.9448 0.3510 0.2399 0.4173 0.4909
如果想删除矩阵A的第2行,则可以使用如下语句:
A(2 , :) = []
由上述语句得到新的矩阵A:
A = 0.1450 0.5132 0.1233 0.0497 0.6221 0.0760 0.2400 0.9448 0.3510 0.2399 0.4173 0.4909
3.2.3 重构矩阵
矩阵重构的两个比较重要的运算是转置和共轭转置,在MATLAB中,用在函数后面加撇号“'”来表示。在线性代数的专业书籍中,这种运算经常用*和H表示。
如果A是一个实数矩阵,那么它被转置时,第1行变成第1列,第2行变成第2列……以此类推,一个m×n矩阵变为一个n×m矩阵。如果矩阵是方阵,那么这个矩阵在主对角线上反映出来。如果矩阵A的元素aij是复数,那么所有元素也是共轭的。如果仅希望转置,则在撇号“'”之前输入一个点号,即成为“.'”,A.'表示转置,其结果与conj(A')相同。如果A是实数矩阵,那么A'与A.'相同。
例3-24:矩阵的重构示例。
在命令行窗口中输入:
C = toeplitz(2 : 5 , 2 : 2 : 8) D = C'
输出结果:
C = 2 4 6 8 3 2 4 6 4 3 2 4 5 4 3 2 D = 2 3 4 5 4 2 3 4 6 4 2 3 8 6 4 2
在命令行窗口中输入:
C = [1 2-5i 5+3i;9-i 6-5i 4+3i;8-10i 4+8i 2-i] D = C' E = C .' F = conj(C')
输出结果:
C = 1.0000 + 0.0000i 2.0000 - 5.0000i 5.0000 + 3.0000i 9.0000 - 1.0000i 6.0000 - 5.0000i 4.0000 + 3.0000i 8.0000 -10.0000i 4.0000 + 8.0000i 2.0000 - 1.0000i D = 1.0000 + 0.0000i 9.0000 + 1.0000i 8.0000 +10.0000i 2.0000 + 5.0000i 6.0000 + 5.0000i 4.0000 - 8.0000i 5.0000 - 3.0000i 4.0000 - 3.0000i 2.0000 + 1.0000i E = 1.0000 + 0.0000i 9.0000 - 1.0000i 8.0000 -10.0000i 2.0000 - 5.0000i 6.0000 - 5.0000i 4.0000 + 8.0000i 5.0000 + 3.0000i 4.0000 + 3.0000i 2.0000 - 1.0000i F = 1.0000 + 0.0000i 9.0000 - 1.0000i 8.0000 -10.0000i 2.0000 - 5.0000i 6.0000 - 5.0000i 4.0000 + 8.0000i 5.0000 + 3.0000i 4.0000 + 3.0000i 2.0000 - 1.0000i