利用MATLAB构建特殊通用矩阵 您所在的位置:网站首页 希尔伯特矩阵怎么求 利用MATLAB构建特殊通用矩阵

利用MATLAB构建特殊通用矩阵

2024-07-09 00:55| 来源: 网络整理| 查看: 265

在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)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有