利用MATLAB构建特殊通用矩阵

在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、魔方矩阵

魔方矩阵又称幻方、九宫格、纵横线,是有相同的行数和列数,并在每行每列、对角线上的和都相等的矩阵,其中矩阵的每一行以及每一列的和均为\frac{n(n^2+1)}{2}。魔方矩阵中的每个元素不能相同。(本段定义参考百度百科魔方矩阵)

在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、帕斯卡矩阵

帕斯卡矩阵是由(x+y)^n展开之后系数随n的增大组成的三角形表,又称为杨辉三角表。其矩阵的第1行和第1列的元素均为1,其余第i行第j列的元素a_{ij}=a_{i,j-1}+a_{i-1,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

同时帕斯卡矩阵可以计算(x+y)^n的展开式中各项的系数,第1至第n项的系数为从a_{n1}a_{n-1,2}...a_{1n}例如计算(x+y)^4的展开式的系数:

a=pascal(4)

运行结果如下所示:

a =
     1     1     1     1
     1     2     3     4
     1     3     6    10
     1     4    10    20

(x+y)_4的各项系数为顺着副对角线从左下角至右上角(或从右上角值左下角)各个元素的值,即:(x+y)^4=x^{3}+3x^{2}y+3xy^{2}+y^{3}

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、希尔伯特矩阵

希尔伯特矩阵是一个数学变化矩阵,每个元素的值a_{ij}=\frac{1}{i+j-1},希尔伯特矩阵是个高度病态的矩阵(即任何一个元素发生变化,整个矩阵的行列式和逆矩阵都会发生巨大变化),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_{n}x^{n}+a_{n-1}x^{n-1}+...+a_{1}x+a_{0}的伴随矩阵为:

A=\begin{bmatrix} - \frac{a_{n-1}}{a_n}& -\frac{a_{n-2}}{a_{n}} & -\frac{a_{n-3}}{a_n} & ... & -\frac{a_{1}}{a_{n}} & -\frac{a_{0}}{a_{n}}\\ 1 & 0 & 0 & ... & 0 & 0\\ 0& 1 & 0 & ... & 0 & 0\\ 0 & 0 & 1& ... & 0 & 0\\ \vdots & \vdots & \vdots & \ddots & \vdots &\vdots \\ 0 & 0 & 0 & \cdots & 1 & 0 \end{bmatrix}

方程p(x)的根称为A的特征值。

MATLAB生成使用compan函数生成伴随矩阵,例如求4x^{4}+5x^{3}+12x^{2}+4x+6的伴随矩阵,代码如下:

运行结果如下所示:

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]

你可能感兴趣的:(数学建模,矩阵,matlab,线性代数)