2026a

# gallery


测试矩阵

# 语法

A1, A2, ..., Am = gallery(matrixname,P1,P2,...,Pn)
_ = gallery(matrixname,typename,P1,P2,...,Pn)
_ = gallery(matrixname,typename,rngstream,P1,P2,...,Pn)
_ = gallery(matrixname,rngstream,P1,P2,...,Pn)
A = gallery(3)
A = gallery(typename,3)
A = gallery(5)
A = gallery(typename,5)

# 说明

A1, A2, ..., Am = gallery(matrixname,P1,P2,...,Pn)生成由 matrixname 指定的一系列测试矩阵。P1,P2,...,Pn 是单个矩阵系列要求的输入参数。调用语法中使用的输入参数 P1,P2,...,Pn 的数目因矩阵而异。matrixname 一节中说明了每个矩阵系列的确切调用语法。示例


A1,A2,..., Am = gallery(matrixname,typename, P1,P2,...,Pn) 还指定生成的测试矩阵的数据类型 typename。


A1,A2,..., Am = gallery(matrixname,typename, rngstream, P1,P2,...,Pn) 指定生成的测试矩阵的数据类型 typename 与随机数使用的随机数流 rngstream。


A1,A2,..., Am = gallery(matrixname, rngstream, P1,P2,...,Pn) 指定生成的测试矩阵中随机数使用的随机数流 rngstream。


A = gallery(3) 生成一个对扰动敏感的病态 3×3 矩阵。示例


A = gallery(typename, 3) 还指定生成的对扰动敏感的病态 3×3 矩阵的数据类型 typename。


A = gallery(5) 生成一个 5×5 矩阵,它具有一个有趣的特征值问题,即对舍入误差很敏感。示例


A = gallery(typename, 5) 还指定 5×5 矩阵的数据类型 typename。

提示

不建议使用该语法。请改用 TestArrays 库函数调用。

# 示例

以缩放颜色显示矩阵元素

以缩放颜色显示几个测试矩阵的矩阵元素。

创建一个大小为 11×11 的循环矩阵。循环矩阵是一种特殊的托普利茨矩阵,其中每行都通过周期性地将上一行中的各元向右移一位来获得。

using TyMath
using TyPlot
using TyImages
C = gallery("circul",11)

显示 C 中矩阵元素的图像。向图形添加颜色栏以显示当前颜色图。

s = imagesc(C)
axis("square")
colorbar(gca(),s)

创建一个大小为 11×11 的 grcar 矩阵。grcar 矩阵是一种非对称的托普利茨矩阵,其下对角线上的元素为 -1,主对角线上的元素为 1,主对角线上方的少数几个对角线上的元素为 1。

G = gallery("grcar",11)

显示 G 中矩阵元素的图像。

a = imagesc(G)
axis("square")
colorbar(gca(),a)

创建一个大小为 11×11 的 minij 矩阵。minij 矩阵 M 是一种其元素满足 M(i,j) = min(i,j) 的对称正定矩阵。

M = gallery("minij",11)

显示 M 中矩阵元素的图像。

a = imagesc(M)
axis("square")
colorbar(gca(),a)
具有整数逆矩阵的整数矩阵

当且仅当整数矩阵的行列式正好是 1 或 –1 时,其逆矩阵也是整数矩阵。行列式为 1 或 –1 的整数方阵也称为幺模矩阵。例如,gallery("dramadah",n) 就是这样一种矩阵,它是由 0 和 1 组成的 n×n 矩阵,行列式为 1 或 –1。

创建一个 6×6 的 dramadah 矩阵。计算其行列式和逆矩阵。

using TyMath
A = gallery("dramadah",6)
A = 6×6 Matrix{Int64}:

 1  1  0  1  0  0
 0  1  1  0  1  0
 0  0  1  1  0  1
 1  0  0  1  1  0
 1  1  0  0  1  1
 0  1  1  0  0  1
detA = det(A)
detA = -1.0
invA = inv(A)
invA = 6×6 Matrix{Float64}:

 -1.0  -2.0  -3.0   4.0  -2.0   5.0    
  1.0   1.0   1.0  -2.0   1.0  -2.0    
 -1.0  -1.0  -2.0   3.0  -2.0   4.0    
  1.0   1.0   2.0  -2.0   1.0  -3.0    
  0.0   1.0   1.0  -1.0   1.0  -2.0    
  0.0   0.0   1.0  -1.0   1.0  -1.0    

该矩阵的逆矩阵只包含整数项,因为原始矩阵的行列式是 -1。

使用 Householder 变换计算 QR 分解

此示例说明如何使用 Householder 变换来计算矩阵 的 QR 分解,其中 是正交矩阵, 是上三角矩阵。

首先,将随机数生成器设置为默认值,并创建由服从标准正态分布的随机数组成的 6×3 矩形矩阵。

using TyMath
using TyBase
rng = MT19937ar(5489)
A = randn(rng,6,3)
A = 6×3 Matrix{Float64}:
  0.537667  -0.433592   0.725404
  1.83389    0.342624  -0.0630549
 -2.25885    3.5784     0.714743
  0.862173   2.76944   -0.204966
  0.318765  -1.34989   -0.124144
 -1.30769    3.03492    1.4897

要创建 Householder 矩阵,请使用函数 v,beta = gallery("house",x)。该函数采用列向量 ,并返回 ,满足 即获得 Householder 矩阵。Householder 变换用于将除了向量 的第一个元素之外的所有元素归零。

计算 Householder 矩阵 并执行变换 。矩阵 在第一列的对角线下只包含零。

v1, beta1 = gallery("house",A[:,1])
P1 = eye(6) - beta1.*(v1*v1')
A1 = P1*A
A1 = 6×3 Matrix{Float64}:
 -3.36298       2.88409   1.04207
 -1.94289e-16   1.90243   0.0858248
  2.77556e-16   1.65714   0.531364
 -9.71445e-17   3.50276  -0.134973
 -4.16334e-17  -1.07876  -0.0982661
  2.22045e-16   1.92267   1.38354

接下来,计算 Householder 矩阵 ,使得 在第一列和第二列中的对角线下只包含零。

v2, beta2 = gallery("house",A1[2:end,2])
v2 = vcat(0,v2)
P2 = eye(6) - beta2.*(v2*v2')
A2 = P2*A1
A2 = 6×3 Matrix{Float64}:
 -3.36298       2.88409       1.04207
 -4.5776e-17   -4.84717      -0.688471
  3.14018e-16   2.22045e-16   0.341261
 -2.00726e-17   2.77556e-16  -0.536799
 -6.53696e-17  -8.32667e-17   0.0254864
  2.6435e-16    0.0           1.16297

最后,计算 Householder 矩阵 ,使得 在下对角线上的元素全部为零。

v3, beta3 = gallery("house",A2[3:end,3])
v3 = vcat(0,0,v3)
P3 = eye(6) - beta3.*(v3*v3')
R = P3*A2
R = 6×3 Matrix{Float64}:
 -3.36298       2.88409       1.04207
 -4.5776e-17   -4.84717      -0.688471
 -3.19581e-16   5.68246e-17  -1.32581
  1.83947e-16   3.30757e-16   5.55112e-17
 -7.50561e-17  -8.57926e-17  -1.73472e-18
 -1.77658e-16  -1.1526e-16   -1.66533e-16

矩阵 是上三角矩阵。由于 Householder 矩阵是对合矩阵(矩阵与其逆矩阵相同), 的 QR 分解成为

Q = P1*P2*P3
Q = 6×6 Matrix{Float64}:
 -0.159878   -0.00567592  -0.669856    0.498317   -0.20357    -0.485735
 -0.545316   -0.395152    -0.175856   -0.643224    0.134199   -0.289506
  0.671681   -0.338591     0.164658   -0.0991317   0.15511    -0.610903
 -0.256372   -0.723894     0.328998    0.524382    0.0805065   0.143362
 -0.0947866   0.222091    -0.0961927   0.187161    0.946325   -0.0433338
  0.388848   -0.394756    -0.612994   -0.134571    0.120327    0.533493

将此结果与使用 qr 函数的计算结果进行比较。

Qa, Ra = qr(A)
Qa = Matrix(Qa)
Qa = 6×3 Matrix{Float64}:
 -0.159878   -0.00567592  -0.669856
 -0.545316   -0.395152    -0.175856
  0.671681   -0.338591     0.164658
 -0.256372   -0.723894     0.328998
 -0.0947866   0.222091    -0.0961927
  0.388848   -0.394756    -0.612994

Ra = 3×3 Matrix{Float64}:

 -3.36298   2.88409   1.04207
  0.0      -4.84717  -0.688471
  0.0       0.0      -1.32581

在计算机精度范围内验证 ,注意虽然这里的 Ra 为 3x3 矩阵,由于我们对 Qa 的特殊类型与矩阵的乘法做了特殊处理,因此这里是可以直接将 Qa 与 Ra 相乘的。

norm(A-Q*R)
ans = 9.160391240386617e-16
复平面上特征值的分布

此示例绘制复平面上 20000 个大小为 18×18 的随机循环矩阵采样的特征值分布。矩阵元素从集合 {–0.4,0.4} 中均匀采样。

创建一个大小为 18×20000 的数组 E 来存储特征值。

E = Matrix{ComplexF64}(undef, 18,20000)

将随机数生成器设置为默认值。在一个 for 循环语句中对以下操作迭代执行 20000 次:

  • 创建一个长度为 18 的向量 x,其中包含的随机元素为 –0.4 或 0.4。

  • 使用向量 x 作为输入,创建随机循环矩阵 A。

  • 找出 A 的特征值,并将其存储在 E 中。

using TyMath
using TyPlot
rng = MT19937ar(5489)
for i = 1:20000
  x = -0.4 .+ 0.8 .*randi(rng,(0,1),18)
  A = TestArrays.circul(x)
  E[:,i] = eigen(A).values
end

创建一个散点图,以在复平面上显示特征值 E。将 x 和 y 轴范围设置为 –3 至 3。

scatter(real(E[:]),imag(E[:]),"b.")
xlabel("Re(E)")
ylabel("Im(E)")
xlim([-3 3])
ylim([-3 3])
axis("square")
对矩阵特征值的扰动效应

创建测试矩阵 gallery(3)。测试矩阵是病态矩阵,包含对扰动敏感的特征值。

using TyMath
A = gallery(3)
A = 3×3 Matrix{Int64}:

 -149  -50  -154
  537  180   546
  -27   -9   -25

使用 eigen 计算 A 的特征值。

e = eigen(A).values
e = 3-element Vector{Float64}:

 1.0000000000122786
 1.9999999999904359
 2.9999999999971494

使用 condeig 计算特征值条件数。

c = condeig(A)[3]
c = 3×1 Matrix{Float64}:
 603.6389649578997
 395.23663799142406
 219.29204271832432

条件数表明,A 的矩阵元素中的扰动可导致其特征值的扰动,其上界约为 4 至 20 倍。

接下来,通过与一个由均匀分布的随机数组成的矩阵相加对 A 进行细微扰动。将随机数生成器的种子设置为其默认值。将 A 与一个随机矩阵相加,该矩阵中的元素在 0 到 0.001(不包含两者)的区间内。

rng = MT19937ar(5489)
Ap = A + .001*rand(rng,3,3)
Ap = 3×3 Matrix{Float64}:
 -148.999   -49.9991  -154.0
  537.001   180.001    546.001
  -26.9999   -8.9999   -24.999

计算扰动矩阵 Ap 的特征值。

ep = eigen(Ap).values
ep = 3-element Vector{Float64}:
 0.7399084779502711
 2.143652522123364
 3.118843589694319

显示扰动特征值和原始特征值之间的差异。

delta = ep - e
delta = 3-element Vector{Float64}:
 -0.2600915220620075
  0.14365252213292812
  0.1188435896971698

将特征值的变化与特征值条件数提供的上界进行比较。上界与特征值扰动的数量级大致相同。

delta_upper = .001*c
delta_upper = 3×1 Matrix{Float64}:
 0.6036389649578997
 0.39523663799142406
 0.21929204271832434
对舍入误差敏感的特征值

创建测试矩阵 A = gallery(5)。测试矩阵具有对舍入误差敏感的特征值。

using TyMath
using TyPlot
A = gallery(5)
A = 5×5 Matrix{Int64}:

   -9     11    -21      63    -252
   70    -69    141    -421    1684
 -575    575  -1149    3451  -13801
 3891  -3891   7782  -23345   93365
 1024  -1024   2048   -6144   24572

在精确算术运算中,矩阵 A 具有 的五重特征值(严格地说,A 具有代数重数为 5 和几何重数为 1 的特征值 0)。这意味着 A 的精确特征多项式为 。验证 是零矩阵。

Afifth = A^5
Afifth = 5×5 Matrix{Int64}:

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

将这些结果与使用 eigen 的特征值的数值计算进行比较。eigen 函数返回 A 的五个小特征值。

e = eigen(A).values
e = 5-element Vector{ComplexF64}:
 -0.03697601048245377 - 0.027495875675886485im
 -0.03697601048245377 + 0.027495875675886485im
  0.01470183030514342 - 0.04265789985234452im
  0.01470183030514342 + 0.04265789985234452im
  0.04454836035943661 + 0.0im

在CentOS结果会不一致,后续生成的图案会有差异

这表明 A 的特征值的数值计算对舍入误差极为敏感,因为计算中使用了浮点精度。

特征值的数值计算与精确算术运算中的数值计算有很大不同。eigen 函数并不求与 A 的精确特征值接近的特征值,而是求与 A 接近的矩阵的特征值。为了说明这一点,我们在复平面上绘制 A 的精确特征值和数值特征值。

plot(0,0,"bo",real(e),imag(e),"r*")
axis([-0.1 0.1 -0.1 0.1])
axis("square")

该图显示,数值特征值位于复平面中一个以原点为中心的正五边形的顶点上。该五边形的半径大约是 0.04。

接下来,计算与 A 相近的 20 个矩阵的特征值。将随机数生成器设置为默认值,并通过将服从标准正态分布的随机数乘以 eps 来扰动 A。绘制 20 个扰动矩阵的数值特征值。

E = Matrix{ComplexF64}(undef,20,5)
rng = MT19937ar(5489)
for i = 1:20
  E[i,:] = eigen(A+eps().*randn(rng,5).*A).values
end
plot(0,0,"bo",real(e),imag(e),"r*",real(E),imag(E),"k.")
axis([-0.1 0.1 -0.1 0.1])
axis("square")

该图显示,当 A 受到扰动时,表示 A 的特征值的原始五边形可以翻转方向。20 个扰动矩阵的特征值位于半径在 0.01 到 0.07 范围内的五边形的顶点上。扰动矩阵的计算特征值的行为类似于原始矩阵的计算特征值。计算特征值的不准确性是由 gallery(5) 的敏感度造成的。

注意

绘图结果与电脑硬件相关,这里的结果只供参考

# 输入参数

matrixname - 矩阵系列的名称
"binomial" | "cauchy" | "chebspec" | "chebvand" | "chow" | "circul" | "clement" | "compar" | ...

矩阵系列的名称,指定为字符向量或字符串标量。参数 matrixname 决定生成的测试矩阵系列,如列表中所示。

P1, P2,..., Pn - 输入参数
标量 | 向量 | 矩阵

输入参数,指定为标量、向量或矩阵。调用语法中使用的参数 P1,P2,...,Pn 取决于矩阵系列,如 matrixname 中的表中所述。

typename - 生成的测试矩阵的数据类型
Type

生成的测试矩阵的数据类型,指定为 Type 成员。

如果未指定 typename,则输出矩阵的数据类型由 P1,P2,...,Pn 中未指定矩阵维数或未选择选项来确定输出矩阵的字符的那些参数确定。

rngstream - 生成测试矩阵使用的随机数流

生成测试矩阵使用的随机数流,如果未指定随机数流,则会使用全局随机数流。

# 输出参数

A1,A2,...,Am - 输出系数、向量、矩阵或多维数组
标量 | 向量 | 矩阵 | 多维数组

输出系数、向量、矩阵或多维数组。调用语法所生成的输出 A1,A2,...,Am 取决于矩阵系列,如 matrixname 中的表中所述。在大多数情况下,gallery 函数只返回一个矩阵作为输出参数。

A - 输出矩阵或多维数组
矩阵 | 多维数组

输出矩阵或多维数组。

# 另请参阅

compan | hadamard | hankel | hilb | magic | pascal | rosser | toeplitz | vander | wilkinson