toeplitz矩阵即​​托普利兹矩阵​​。

托普利兹矩阵的主对角线上的元素相等,平行于主对角线的线上的元素也相等;矩阵中的各元素关于次对角线对称,即T型矩阵为次对称矩阵。在数学软件MATLAB中,生成托普利兹矩阵的函数是:toeplitz(x,y)。它生成一个以 x 为第一列,y 为第一行的托普利兹矩阵,这里x, y均为向量,两者不必等长。

查看MATLAB生成托普利兹矩阵的函数toeplitz.m源代码文件请​​点击这里​​。

我将根据其源代码逻辑,写成Python生成toeplitz矩阵的代码,首先注意下面的函数只针对:

  • 参数c与r都是由数字组成的二维数组,若要生成同一个二维数组的toeplitz矩阵,则需要输入该数组两次。
  • c与r二者左上角的那一个元素尽量要相同,尽管在不同时生成的矩阵也是toeplitz矩阵,但是参数r的第一个元素可能就不被包含在生成的toeplitz矩阵中了。
  • 数字为浮点型或者整型都可以
  • 若c与r为一维行向量或者列向量,则需要将其维数转换为1×N或者N×1的二维数组
import numpy as np

def toeplitz(c,r): #生成托普利茨矩阵
c=np.array(c)
r=np.array(r)

#将c与r的全部元素构成列向量
m,n=c.shape
y,z=r.shape
temp1=[]
temp2=[]
for i in range(n):
for temp in c:
temp1.append(temp[i])
for i in range(z):
for temp in r:
temp2.append(temp[i])

c=temp1
r=temp2

p=len(r)
m=len(c)

x=list(r[p-1:0:-1])
for i in c:
x.append(i)

temp3=np.arange(0,m)
temp4=np.arange(p-1,-1,-1)

temp3.shape=(m,1)
temp4.shape=(1,p)

ij=temp3+temp4
t=np.array(x)[ij]

return t

示例1(两个输入参数为一维数组时,要在外层再加一层括号,使其变成二维的;这里c与r二者左上角的那一个元素不同,但是生成的矩阵仍是toeplitz矩阵,此时参数r的第一个元素就不被包含在生成的toeplitz矩阵中了):

toeplitz([[5,7,2,3]],[[4,2,3]])

输出如下:

array([[5, 2, 3],
[7, 5, 2],
[2, 7, 5],
[3, 2, 7]])

示例2(若要生成同一个二维数组的toeplitz矩阵,则需要输入该数组两次):

toeplitz([[5,7,2,3]],[[5,7,2,3]])

输出如下:

array([[5, 7, 2, 3],
[7, 5, 7, 2],
[2, 7, 5, 7],
[3, 2, 7, 5]])

示例3:

toeplitz([[5,7],[2,3]],[[9,8],[4,1]])

输出如下:

array([[5, 4, 8, 1],
[2, 5, 4, 8],
[7, 2, 5, 4],
[3, 7, 2, 5]])

END