scipy.linalg
中提供了一系列特殊矩阵的生成方法,包括循环矩阵、汉克尔矩阵、费德勒矩阵、阿达马矩阵、莱斯利矩阵、希尔伯特及其逆矩阵、帕斯卡及其逆矩阵等。
循环矩阵
现有一向量
c
=
[
c
0
,
c
1
,
⋯
,
c
n
]
c=[c_0, c_1,\cdots,c_n]
c=[c0,c1,⋯,cn],则circulant(c)
返回一个矩阵,记作
A
A
A,矩阵第
i
i
i行第
j
j
j列元素为
a
i
j
a_{ij}
aij,则
a
i
j
=
c
mod
(
i
−
j
,
n
)
a_{ij} = c_{\operatorname{mod}(i-j, n)}
aij=cmod(i−j,n)
A = circulant([1,2,3])
print(A)
'''
[[1 3 2]
[2 1 3]
[3 2 1]]
'''
汉克尔矩阵
汉克尔矩阵和循环矩阵十分相似,不过在向左移位的过程中,hankel(c, r=None)
在末尾直接赋0。若r
不为None
,则通过r
对末位进行赋值
print(hankel([1,2,3,4], [0,7,7,8,9]))
'''
[[1 2 3 4 7]
[2 3 4 7 7]
[3 4 7 7 8]
[4 7 7 8 9]]
'''
费德勒矩阵
现有一向量
a
=
[
a
0
,
a
1
,
⋯
,
a
n
]
a=[a_0, a_1,\cdots,a_n]
a=[a0,a1,⋯,an],则fiedler(a)
返回一个矩阵,记作
F
F
F,设
F
F
F第
i
i
i行第
j
j
j列元素为
f
i
j
f_{ij}
fij,则
f
i
j
=
∣
a
i
−
a
j
∣
f_{ij}=\vert a_i-a_j\vert
fij=∣ai−aj∣,所以显而易见,其对角元素均为0。
F = fiedler([1,2,4,8,16])
print(F)
'''
[[ 0 1 3 7 15]
[ 1 0 2 6 14]
[ 3 2 0 4 12]
[ 7 6 4 0 8]
[15 14 12 8 0]]
'''
阿达马矩阵
阿达马矩阵的每个元素都是
±
1
\pm1
±1,每行都互相正交,常用于纠错码。在scipy.linalg
中,hadamard(n, dtype)
根据n
来生成标准的
n
×
n
n\times n
n×n阿达马矩阵,需要注意
n
n
n必须为偶数,dtype
为可选参数,用于指明矩阵的数据类型。
print(hadamard(4))
'''
[[ 1 1 1 1]
[ 1 -1 1 -1]
[ 1 1 -1 -1]
[ 1 -1 -1 1]]
'''
莱斯利矩阵
leslie(f, s)
,其输入
f
f
f和
s
s
s两个向量,输出矩阵的形式为
[ f 1 f 2 ⋯ f m − 1 f m s 1 0 ⋯ 0 0 0 s 2 ⋯ 0 0 ⋮ ⋮ ⋮ ⋮ 0 0 ⋯ s m − 1 0 ] \begin{bmatrix} f_1&f_2&\cdots&f_{m-1}&f_m\\ s_1&0&\cdots&0&0\\ 0&s_2&\cdots&0&0\\ \vdots&\vdots&&\vdots&\vdots\\ 0&0&\cdots&s_{m-1}&0 \end{bmatrix} f1s10⋮0f20s2⋮0⋯⋯⋯⋯fm−100⋮sm−1fm00⋮0
print(leslie([0.1, 2.0, 1.0, 0.1], [0.2, 0.8, 0.7]))
'''
[[0.1 2. 1. 0.1]
[0.2 0. 0. 0. ]
[0. 0.8 0. 0. ]
[0. 0. 0.7 0. ]]
'''
希尔伯特及其逆矩阵
则hilbert(n)
返回一个
n
×
n
n\times n
n×n矩阵
H
H
H,第
i
i
i行第
j
j
j列元素
h
i
j
=
1
i
+
j
+
1
h_{ij}=\frac{1}{i+j+1}
hij=i+j+11。
print(hilbert(3))
'''
[[1. 0.5 0.33333333]
[0.5 0.33333333 0.25 ]
[0.33333333 0.25 0.2 ]]
'''
invhilbert(n, exact=False)
可生成
n
×
n
n\times n
n×n希尔伯特矩阵的逆矩阵,当exact
为False
时,返回np.float64
类型矩阵;否则返回np.int64
类型。
帕斯卡及其逆矩阵
帕斯卡矩阵存在一个递推关系,即
a
i
j
=
a
i
−
1
,
j
+
a
i
,
j
−
1
a_{ij}=a_{i-1,j}+a{i,j-1}
aij=ai−1,j+ai,j−1,且
a
i
0
=
1
,
a
0
j
=
1
a_{i0}=1,a_{0j}=1
ai0=1,a0j=1,从形状上看就是倒过来的帕斯卡三角。在pascal(n, kind, exact)
函数中,kind
可选symmetric, lower,upper
,分别表示对称矩阵、下三角、上三角矩阵,默认symmetric
。文章来源:https://www.toymoban.com/news/detail-597437.html
print(pascal(4))
'''
[[ 1 1 1 1]
[ 1 2 3 4]
[ 1 3 6 10]
[ 1 4 10 20]]
'''
invpascal
可生成逆帕斯卡矩阵,其参数与pascal
相同。文章来源地址https://www.toymoban.com/news/detail-597437.html
到了这里,关于【python】用scipy生成特殊矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!