【python】用scipy生成特殊矩阵

文章目录

    • 循环矩阵
    • 汉克尔矩阵
    • 费德勒矩阵
    • 阿达马矩阵
    • 莱斯利矩阵
    • 希尔伯特及其逆矩阵
    • 帕斯卡及其逆矩阵

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(ij,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=aiaj,所以显而易见,其对角元素均为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} f1s100f20s20fm100sm1fm000

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希尔伯特矩阵的逆矩阵,当exactFalse时,返回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=ai1,j+ai,j1,且 a i 0 = 1 , a 0 j = 1 a_{i0}=1,a_{0j}=1 ai0=1a0j=1,从形状上看就是倒过来的帕斯卡三角。在pascal(n, kind, exact)函数中,kind可选symmetric, lower,upper,分别表示对称矩阵、下三角、上三角矩阵,默认symmetric

print(pascal(4))
'''
[[ 1  1  1  1]
 [ 1  2  3  4]
 [ 1  3  6 10]
 [ 1  4 10 20]]
'''

invpascal可生成逆帕斯卡矩阵,其参数与pascal相同。

你可能感兴趣的:(python,scipy,特殊矩阵,循环矩阵,希尔伯特矩阵)