利用MATLAB构建特殊通用矩阵

在MATLAB编程中,经常需要遇到一些特殊的通用矩阵,本篇主要介绍的是MATLAB中可能会用到特殊矩阵。

1、零矩阵

MATLAB使用zeros函数来创建零矩阵,所谓零矩阵就是矩阵中所有元素皆为0的矩阵。zeros函数的调用方式如下所示:

(1)zeros(n):n为常数,生成一个n×n的矩阵。

例如,生成一个4×4的零矩阵的代码为:

Matlab 复制代码
a=zeros(4)

运行结果如下所示:

Matlab 复制代码
a =
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0

当n的值省略的时候,那么生成一个1×1的向量,结果如下所示:

Matlab 复制代码
ans =

     0

(2)zeros(m,n):m,n均为常数,生成一个m×n的零矩阵。生成一个m×n的零矩阵也可以写成zeros([m,n])的方式。

例如生成一个3×4的零矩阵的代码如下:

Matlab 复制代码
a=zeros(3,4)

运行结果如下所示:

Matlab 复制代码
a =
     0     0     0     0
     0     0     0     0
     0     0     0     0

(3)zeros(size(A)):A为矩阵,zeros生成一个与矩阵A相同行和列的零矩阵。

例如:

Matlab 复制代码
A=[3,4,5;2,7,8];
a=zeros(size(A))

运行结果如下所示:

Matlab 复制代码
a =
     0     0     0
     0     0     0

(4)zeros(m,n,'like',p):p为矩阵,生成一个与p类型相同,大小为m行n列的零矩阵。

例如:

Matlab 复制代码
p=[2+1i,3;4,2+3i];
zeros(3,2,'like',p)

在上述代码段中的p矩阵为一个复数矩阵,那么matlab中所求的结果应为一个3行2列的复数矩阵。运行结果如下所示:

Matlab 复制代码
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')

运行结果如下所示:

Matlab 复制代码
a =

  3×4 int16 矩阵

   0   0   0   0
   0   0   0   0
   0   0   0   0

在例如,生成一个3行4列的logical类型的矩阵代码如下所示:

Matlab 复制代码
a=zeros(4,4,'logical')

运行结果如下如所示:

Matlab 复制代码
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逻辑矩阵,代码如下所示:

Matlab 复制代码
a=false(3,4)

运行结果如下所示:

Matlab 复制代码
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函数的代码如下所示:

Matlab 复制代码
a=ones(4,6)

运行结果如下所示:

Matlab 复制代码
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逻辑矩阵,代码如下所示:

Matlab 复制代码
a=true(3,4)

运行结果如下所示:

Matlab 复制代码
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列的单位矩阵代码如下:

Matlab 复制代码
a=eye(3,3)

运行结果如下所示:

Matlab 复制代码
a =
     1     0     0
     0     1     0
     0     0     1

需要注意的是,eye函数不仅可以初始化单位矩阵,同时可以初始化行和列不相同的矩阵,其中主对角线的元素全为1,其余元素均为0。例如:

Matlab 复制代码
a=eye(3,4)
b=eye(4,3)

运行结果如下所示:

Matlab 复制代码
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列的随机矩阵,代码如下:

Matlab 复制代码
a=rand(3,4)

运行结果如下所示:

Matlab 复制代码
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]之间的矩阵,代码如下所示:

Matlab 复制代码
a=randi(6,4,5)

运行结果如下所示:

Matlab 复制代码
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列的矩阵,代码如下所示:

Matlab 复制代码
a=randn(4,5)

运行结果如下所示:

Matlab 复制代码
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]之间的整数随机排列的向量:

Matlab 复制代码
a=randperm(6,6)

运行结果如下所示:

Matlab 复制代码
a =
     2     1     5     3     4     6

需要注意的是randperm(n,k)中,但k的小于n时(k必须小于等于n),运行结果是随机选取k个[1,n]的整数进行随机排列的向量。

例如,初始化一个长度为4,将区间[1,6]的整数随机排列的向量,代码如下所示:

Matlab 复制代码
a=randperm(6,4)

运行结果如下所示:

Matlab 复制代码
a =

     3     6     4     1

5、魔方矩阵

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

在MATLAB中,提供magic函数来生成一个魔方矩阵,调用格式如下所示:

magic(n):生成n阶的魔方矩阵。

例如生成一个4阶的魔方矩阵,代码如下所示:

Matlab 复制代码
a=magic(4)

运行结果如下所示:

Matlab 复制代码
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阶矩阵,代码如下:

Matlab 复制代码
a=vander([1,3,4,7,8])

运行结果如下所示:

Matlab 复制代码
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阶帕斯卡矩阵,代码如下:

Matlab 复制代码
a=pascal(5)

运行结果如下所示:

Matlab 复制代码
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项的系数为从...例如计算的展开式的系数:

Matlab 复制代码
a=pascal(4)

运行结果如下所示:

Matlab 复制代码
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向量的首元素必须相同。

例如初始化化一个托普利兹矩阵:

Matlab 复制代码
 a=toeplitz([4,3,2,6],[4,6,9,10,12])

运行结果如下所示:

Matlab 复制代码
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阶希尔伯特矩阵:

Matlab 复制代码
a=hilb(4)

运行结果如下所示:

Matlab 复制代码
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阶矩阵。

Matlab 复制代码
a=hilb(5,'single')

运行结果如下所示:

Matlab 复制代码
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函数生成伴随矩阵,例如求的伴随矩阵,代码如下:

运行结果如下所示:

Matlab 复制代码
a=compan([4,5,12,4,6])

运行结果如下所示:

Matlab 复制代码
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]。

例如将三个矩阵的纵向合并矩阵:

Matlab 复制代码
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)

运行结果如下:

Matlab 复制代码
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]。

例如:

Matlab 复制代码
A=[1,3;4,6;3,1];
B=[3,2;1,4;5,1];
A=horzcat(A,B)

运行结果如下所示:

Matlab 复制代码
A =
     1     3     3     2
     4     6     1     4
     3     1     5     1

(3)horzcat(A1,A2,...An):纵向合并矩阵,horzcat(A,B)等同于[A;B]。

例如:

Matlab 复制代码
A=[1,3,4;6,3,1];
B=[3,2,1;4,5,1];
A=vertcat(A,B)

运行结果如下所示:

Matlab 复制代码
A =
     1     3     4
     6     3     1
     3     2     1
     4     5     1

(4)repmat(A,m,n):复制矩阵A来构造一个新的矩阵,其中纵向复制m个A,横向复制有n个A。

例如:

Matlab 复制代码
A=[1,4;5,8]
A=repmat(A,2,3)

运行结果如下所示:

Matlab 复制代码
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是一个向量时:

Matlab 复制代码
val=1;
subs=[1;2;5;2;4];
a=accumarray(subs,val)

运行结果如下所示:

Matlab 复制代码
a =
     1
     2
     0
     1
     1

由上图中的运行显示,返回的是一个计数向量,表示的subs向量中下标出现次数与val的积。如果将val的值改为2:

Matlab 复制代码
val=2;
subs=[1;2;5;2;4];
a=accumarray(subs,val)

运行结果如下所示:

Matlab 复制代码
a =
     2
     4
     0
     2
     2

对比两次运行结果可以看到,当val变化增加一倍时,返回的结果也同样增加一倍。

当val是一个向量时:

Matlab 复制代码
val=10:10:50;
subs=[1;2;5;3;4];
a=accumarray(subs,val)

运行结果如下所示:

Matlab 复制代码
a =
    10
    20
    40
    50
    30

当subs是一个二维矩阵的时候,subs矩阵中的每行是val中对应元素的位置。

例如:

Matlab 复制代码
val = 10:10:50;
subs=[1,3;3,1;2,2;3,2;2,1];
a=accumarray(subs,val)

运行结果如下所示:

Matlab 复制代码
a =

     0     0    10
    50    30     0
    20    40     0

当subs中如果两行元素相同的时候,那么对应的val就会累计起来。例如:

Matlab 复制代码
val = 10:10:50;
subs=[1,3;3,1;2,2;3,2;3,1];
a=accumarray(subs,val)

运行结果如下所示:

Matlab 复制代码
a =

     0     0    10
     0    30     0
    70    40     0

(2)accumarray(subs,val,sz):subs和val同(1)相同,而sz表示的是输出数组的大小。其中,ALL(MAX(subs)<=sz),例如:

Matlab 复制代码
val=10:10:50;
subs=[1;2;5;3;4];
sz=[6 1]
a=accumarray(subs,val,sz)

运行结果如下所示:

Matlab 复制代码
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表示的是函数,默认情况下为[],例如;

Matlab 复制代码
val = 1:5;
subs = [1,1;2,1;2,2;1,2;2,1];
a = accumarray(subs,val,[],@(x) {x})

运行结果如下所示:

Matlab 复制代码
a =

  2×2 cell 数组

    {[       1]}    {[4]}
    {2×1 double}    {[3]
相关推荐
酌沧16 小时前
大模型的底层运算线性代数
线性代数
程高兴17 小时前
遗传算法求解冷链路径优化问题matlab代码
开发语言·人工智能·matlab
念念01071 天前
基于MATLAB多智能体强化学习的出租车资源配置优化系统设计与实现
大数据·人工智能·matlab
fengfuyao9851 天前
基于MATLAB的GUI实现人脸检测、眼睛检测以及LBP直方图显示
开发语言·计算机视觉·matlab
一株月见草哇2 天前
Matlab(5)进阶绘图
matlab
老歌老听老掉牙2 天前
SymPy 矩阵到 NumPy 数组的全面转换指南
python·线性代数·矩阵·numpy·sympy
星期天要睡觉2 天前
机器学习——CountVectorizer将文本集合转换为 基于词频的特征矩阵
人工智能·机器学习·矩阵
洋曼巴-young2 天前
240. 搜索二维矩阵 II
数据结构·算法·矩阵
何妨重温wdys2 天前
矩阵链相乘的最少乘法次数(动态规划解法)
c++·算法·矩阵·动态规划
项目申报小狂人2 天前
算法应用上新!自适应更新策略差分进化算法求解球形多飞行器路径规划问题,附完整MATLAB代码
开发语言·算法·matlab