在MATLAB编程中,经常需要遇到一些特殊的通用矩阵,本篇主要介绍的是MATLAB中可能会用到特殊矩阵。
1、零矩阵
MATLAB使用zeros函数来创建零矩阵,所谓零矩阵就是矩阵中所有元素皆为0的矩阵。zeros函数的调用方式如下所示:
(1)zeros(n):n为常数,生成一个n×n的矩阵。
例如,生成一个4×4的零矩阵的代码为:
a=zeros(4)
运行结果如下所示:
a =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
当n的值省略的时候,那么生成一个1×1的向量,结果如下所示:
ans =
0
(2)zeros(m,n):m,n均为常数,生成一个m×n的零矩阵。生成一个m×n的零矩阵也可以写成zeros([m,n])的方式。
例如生成一个3×4的零矩阵的代码如下:
a=zeros(3,4)
运行结果如下所示:
a =
0 0 0 0
0 0 0 0
0 0 0 0
(3)zeros(size(A)):A为矩阵,zeros生成一个与矩阵A相同行和列的零矩阵。
例如:
A=[3,4,5;2,7,8];
a=zeros(size(A))
运行结果如下所示:
a =
0 0 0
0 0 0
(4)zeros(m,n,'like',p):p为矩阵,生成一个与p类型相同,大小为m行n列的零矩阵。
例如:
p=[2+1i,3;4,2+3i];
zeros(3,2,'like',p)
在上述代码段中的p矩阵为一个复数矩阵,那么matlab中所求的结果应为一个3行2列的复数矩阵。运行结果如下所示:
ans =
0.0000 + 0.0000i 0.0000 + 0.0000i
0.0000 + 0.0000i 0.0000 + 0.0000i
0.0000 + 0.0000i 0.0000 + 0.0000i
(5)zeros(m,n,typename):生成一个m行n列的矩阵,其中矩阵的中所有元素的类型通过typename指定的。
例如,生成一个3行4列的int类型的矩阵代码如下所示:
a=zeros(3,4,'int16')
运行结果如下所示:
a =
3×4 int16 矩阵
0 0 0 0
0 0 0 0
0 0 0 0
在例如,生成一个3行4列的logical类型的矩阵代码如下所示:
a=zeros(4,4,'logical')
运行结果如下如所示:
a =
4×4 logical 数组
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
在typename中可以选择的值包括:'double'、'single'、‘logical’、‘int8‘、’int16‘、'int32'、’uint8‘、'uint16'、’uint32‘或者是zeros函数支持的其他类的名称。
(5)flase函数
在MATLAB中,false函数用于生成全为0的逻辑矩阵。
例如,生成一个3行4类的全0逻辑矩阵,代码如下所示:
a=false(3,4)
运行结果如下所示:
a =
3×4 logical 数组
0 0 0 0
0 0 0 0
0 0 0 0
需要注意的是,false(3,4)和zeros(3,4,'logical')所达成的效果是相同的。
2、幺矩阵
在线性代数中,矩阵中的所有元素的值全为1的矩阵的称为幺矩阵,在MATLAB中初始化幺矩阵通常使用ones函数,其中ones函数所使用的调用格式与zeros函数类似。
(1)例如,建立一个4行6列的ones函数的代码如下所示:
a=ones(4,6)
运行结果如下所示:
a =
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
通过与zeros函数进行类比,可以对于ones函数使用相同的操作。
(2)true函数
在MATLAB中,true函数用于生成全为1的逻辑矩阵。
例如,生成一个3行4类的全1逻辑矩阵,代码如下所示:
a=true(3,4)
运行结果如下所示:
a =
3×4 logical 数组
1 1 1 1
1 1 1 1
1 1 1 1
需要注意的是,true(3,4)和ones(3,4,'logical')所达成的效果是相同的。
3、eye函数
在MATLAB中,eye函数可以初始化单位矩阵,即对角线上元素均为1其余元素均为0的方阵。
例如初始化一个3行3列的单位矩阵代码如下:
a=eye(3,3)
运行结果如下所示:
a =
1 0 0
0 1 0
0 0 1
需要注意的是,eye函数不仅可以初始化单位矩阵,同时可以初始化行和列不相同的矩阵,其中主对角线的元素全为1,其余元素均为0。例如:
a=eye(3,4)
b=eye(4,3)
运行结果如下所示:
a =
1 0 0 0
0 1 0 0
0 0 1 0
b =
1 0 0
0 1 0
0 0 1
0 0 0
4、随机矩阵
在MATLAB中,有多个函数用于生成随机矩阵,包括rand函数、randi函数、randn函数和randperm函数:
(1)rand(m,n):生成一个m行n列的矩阵,矩阵中所有元素的值均在0-1之间。
例如初始化一个3行4列的随机矩阵,代码如下:
a=rand(3,4)
运行结果如下所示:
a =
0.8147 0.9134 0.2785 0.9649
0.9058 0.6324 0.5469 0.1576
0.1270 0.0975 0.9575 0.9706
(2)randi(imax,m,n):生成一个m行n列的矩阵,其中矩阵的所有元素为[1,imax]均匀分布的随机矩阵。
例如初始化一个4行5列,元素从[1,6]之间的矩阵,代码如下所示:
a=randi(6,4,5)
运行结果如下所示:
a =
6 3 4 5 4
3 6 1 5 2
5 5 6 5 5
1 6 6 3 1
(3)randn(m,n):生成一组3行4列的矩阵,其中矩阵中的所有元素为平均值为0、方差为1的标准正太分布随机数。
例如,初始化一个均值为0、方差为1的4行5列的矩阵,代码如下所示:
a=randn(4,5)
运行结果如下所示:
a =
0.6007 1.5326 1.1174 1.1006 -0.7423
-1.2141 -0.7697 -1.0891 1.5442 -1.0616
-1.1135 0.3714 0.0326 0.0859 2.3505
-0.0068 -0.2256 0.5525 -1.4916 -0.6156
(4)randperm(n,k):将[1,n]的整数随机排列,生成一个指定长度为k的向量:
例如初始化一个长度为6,将[1,6]之间的整数随机排列的向量:
a=randperm(6,6)
运行结果如下所示:
a =
2 1 5 3 4 6
需要注意的是randperm(n,k)中,但k的小于n时(k必须小于等于n),运行结果是随机选取k个[1,n]的整数进行随机排列的向量。
例如,初始化一个长度为4,将区间[1,6]的整数随机排列的向量,代码如下所示:
a=randperm(6,4)
运行结果如下所示:
a =
3 6 4 1
5、魔方矩阵
魔方矩阵又称幻方、九宫格、纵横线,是有相同的行数和列数,并在每行每列、对角线上的和都相等的矩阵,其中矩阵的每一行以及每一列的和均为。魔方矩阵中的每个元素不能相同。(本段定义参考百度百科魔方矩阵)
在MATLAB中,提供magic函数来生成一个魔方矩阵,调用格式如下所示:
magic(n):生成n阶的魔方矩阵。
例如生成一个4阶的魔方矩阵,代码如下所示:
a=magic(4)
运行结果如下所示:
a =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
6、范德蒙德矩阵
使用MATLAB所生成的范德蒙德矩阵中,最后一列的元素全为1,倒数第二列的元素为用户指定的向量,而其余列是其后一列向量与倒数第二列向量的点乘积。在MATLAB中,使用vander函初始化一个范德蒙德矩阵。
例如,初始一个倒数第二行元素从上到下依次是1、3、4、7、8的5阶矩阵,代码如下:
a=vander([1,3,4,7,8])
运行结果如下所示:
a =
1 1 1 1 1
81 27 9 3 1
256 64 16 4 1
2401 343 49 7 1
4096 512 64 8 1
7、帕斯卡矩阵
帕斯卡矩阵是由展开之后系数随n的增大组成的三角形表,又称为杨辉三角表。其矩阵的第1行和第1列的元素均为1,其余第i行第j列的元素。在MATLAB中使用pascal函数生成一个n阶帕斯卡矩阵。
例如,生成一个5阶帕斯卡矩阵,代码如下:
a=pascal(5)
运行结果如下所示:
a =
1 1 1 1 1
1 2 3 4 5
1 3 6 10 15
1 4 10 20 35
1 5 15 35 70
同时帕斯卡矩阵可以计算的展开式中各项的系数,第1至第n项的系数为从、...例如计算的展开式的系数:
a=pascal(4)
运行结果如下所示:
a =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
则的各项系数为顺着副对角线从左下角至右上角(或从右上角值左下角)各个元素的值,即:
8、托普利兹矩阵
托普利兹矩阵是矩阵第一行和第一列的元素,其他元素都是和左上角的元素相同。在MATLAB中,toeplitz(v1,v2):v1和v2分别表示托普利兹矩阵的第一列的列向量和第一行的行向量。其中v1向量和v2向量的首元素必须相同。
例如初始化化一个托普利兹矩阵:
a=toeplitz([4,3,2,6],[4,6,9,10,12])
运行结果如下所示:
a =
4 6 9 10 12
3 4 6 9 10
2 3 4 6 9
6 2 3 4 6
9、希尔伯特矩阵
希尔伯特矩阵是一个数学变化矩阵,每个元素的值,希尔伯特矩阵是个高度病态的矩阵(即任何一个元素发生变化,整个矩阵的行列式和逆矩阵都会发生巨大变化),MATLAB提供了hilb函数生成希尔伯特矩阵。其中hilb函数有两种调用格式:
hilb(n):n为常数,返回一个n阶的希尔伯特矩阵。
hilb(n,classname):n为常数,表示的是希尔伯特矩阵的阶数,classname表示矩阵的类,classname的矩阵的类,可以取值为‘double’和‘single’,其中默认值为‘double’。
例如初始化一个4阶希尔伯特矩阵:
a=hilb(4)
运行结果如下所示:
a =
1.0000 0.5000 0.3333 0.2500
0.5000 0.3333 0.2500 0.2000
0.3333 0.2500 0.2000 0.1667
0.2500 0.2000 0.1667 0.1429
在例如初始化一个single类的5阶矩阵。
a=hilb(5,'single')
运行结果如下所示:
a =
5×5 single 矩阵
1.0000 0.5000 0.3333 0.2500 0.2000
0.5000 0.3333 0.2500 0.2000 0.1667
0.3333 0.2500 0.2000 0.1667 0.1429
0.2500 0.2000 0.1667 0.1429 0.1250
0.2000 0.1667 0.1429 0.1250 0.1111
MATLAB中有专门求希尔伯特矩阵的逆矩阵的函数invhilb函数,当n小于15时,invhilb(n)生成希尔伯特矩阵的精确的逆矩阵,当n大于15时,invhilb(n)生成的是Hilbert矩阵的近似矩阵。
10、伴随矩阵
MATLAB对于一个多项式的伴随矩阵为:
方程p(x)的根称为A的特征值。
MATLAB生成使用compan函数生成伴随矩阵,例如求的伴随矩阵,代码如下:
运行结果如下所示:
a=compan([4,5,12,4,6])
运行结果如下所示:
a =
-1.2500 -3.0000 -1.0000 -1.5000
1.0000 0 0 0
0 1.0000 0 0
0 0 1.0000 0
11、级联矩阵
MATLAB将用指定方向进行合并两个或者多个矩阵,函数调用如下如下:
(1)cat(dim,A1,A2,A3,A4,...An):在指定维度合并矩阵,cat(1,A,B)等同于cat(1,A,B)等同于[A;B],而cat(2,A,B)等同于[A,B]。
例如将三个矩阵的纵向合并矩阵:
A=[1,2,3;4,3,5];
B=[1,2,1;5,4,1];
C=[0,1,6;7,3,1];
D=cat(1,A,B,C)
E=cat(2,A,B,C)
运行结果如下:
D =
1 2 3
4 3 5
1 2 1
5 4 1
0 1 6
7 3 1
E =
1 2 3 1 2 1 0 1 6
4 3 5 5 4 1 7 3 1
(2)horzcat(A1,A2,...An):横向合并矩阵,horzcat(A,B)等同于[A,B]。
例如:
A=[1,3;4,6;3,1];
B=[3,2;1,4;5,1];
A=horzcat(A,B)
运行结果如下所示:
A =
1 3 3 2
4 6 1 4
3 1 5 1
(3)horzcat(A1,A2,...An):纵向合并矩阵,horzcat(A,B)等同于[A;B]。
例如:
A=[1,3,4;6,3,1];
B=[3,2,1;4,5,1];
A=vertcat(A,B)
运行结果如下所示:
A =
1 3 4
6 3 1
3 2 1
4 5 1
(4)repmat(A,m,n):复制矩阵A来构造一个新的矩阵,其中纵向复制m个A,横向复制有n个A。
例如:
A=[1,4;5,8]
A=repmat(A,2,3)
运行结果如下所示:
A =
1 4 1 4 1 4
5 8 5 8 5 8
1 4 1 4 1 4
5 8 5 8 5 8
12、累计矩阵
在MATLAB中,使用accumarray对于指定的向量进行累计,然后用计算的结果构造一个新的矩阵。accumarray有如下几种调用格式:
(1)accumarray(subs,val):subs是下标矩阵或者是向量,而val是数据,val可以是一个标量或者是一个向量。
当subs是一个向量时:
val=1;
subs=[1;2;5;2;4];
a=accumarray(subs,val)
运行结果如下所示:
a =
1
2
0
1
1
由上图中的运行显示,返回的是一个计数向量,表示的subs向量中下标出现次数与val的积。如果将val的值改为2:
val=2;
subs=[1;2;5;2;4];
a=accumarray(subs,val)
运行结果如下所示:
a =
2
4
0
2
2
对比两次运行结果可以看到,当val变化增加一倍时,返回的结果也同样增加一倍。
当val是一个向量时:
val=10:10:50;
subs=[1;2;5;3;4];
a=accumarray(subs,val)
运行结果如下所示:
a =
10
20
40
50
30
当subs是一个二维矩阵的时候,subs矩阵中的每行是val中对应元素的位置。
例如:
val = 10:10:50;
subs=[1,3;3,1;2,2;3,2;2,1];
a=accumarray(subs,val)
运行结果如下所示:
a =
0 0 10
50 30 0
20 40 0
当subs中如果两行元素相同的时候,那么对应的val就会累计起来。例如:
val = 10:10:50;
subs=[1,3;3,1;2,2;3,2;3,1];
a=accumarray(subs,val)
运行结果如下所示:
a =
0 0 10
0 30 0
70 40 0
(2)accumarray(subs,val,sz):subs和val同(1)相同,而sz表示的是输出数组的大小。其中,ALL(MAX(subs)<=sz),例如:
val=10:10:50;
subs=[1;2;5;3;4];
sz=[6 1]
a=accumarray(subs,val,sz)
运行结果如下所示:
a =
10
20
40
50
30
0
由运行结果可以看出,返回的结果为6行1列的矩阵,其中大于原来行数的内容会用0来补充。
(3)accumarray(subs,val,sz,fun):subs和val同(1)相同,sz表示的输出数组的大小,其中,其中ALL(MAX(subs)<=sz),fun表示的是函数,默认情况下为[],例如;
val = 1:5;
subs = [1,1;2,1;2,2;1,2;2,1];
a = accumarray(subs,val,[],@(x) {x})
运行结果如下所示:
a =
2×2 cell 数组
{[ 1]} {[4]}
{2×1 double} {[3]