我想创建一个toeplitz矩阵的toeplitz矩阵。
h1,h2和h3已经是toeplitz矩阵了。我的结果应该是这样的:
H1 0 0H2 H1 0H3 H2 H10 H3 H20 0 H3
现有的Toeplitz函数只接受向量,所以不能用它来表示矩阵。目前我使用vstack创建第一列,然后是第二列等,然后使用hstack合并所有列。这需要很大的努力,因为我必须在某些地方特别添加np.zeros矩阵。我想不出一个更好的方法来连接numpy数组,因为只有几个函数可以连接numpy数组,而且没有一个真正适合我的问题。

最佳答案

与对vstackhstack的嵌套调用不同,预先分配最后一个数组,然后使用嵌套循环填充数组会更有效。最初可以使用高维数组来保持代码的干净。
例如,这个脚本

import numpy as np

H1 = np.array([[11, 11], [11, 11]])
H2 = np.array([[22, 22], [22, 22]])
H3 = np.array([[33, 33], [33, 33]])

inputs = (H1, H2, H3)

# This assumes all the arrays in `inputs` have the same shape,
# and that the data type of all the arrays is the same as H1.dtype.
nh = len(inputs)
nrows = 2*nh - 1
m, n = H1.shape
# T is a 4D array.  For a given i and j, T[i, :, j, :] is a 2D array
# with shape (m, n).  T can be intepreted as a 2D array of 2D arrays.
T = np.zeros((nrows, m, nh, n), dtype=H1.dtype)
for i, H in enumerate(inputs):
    for j in range(nh):
        T[i + j, :, j, :] = H

# Partially flatten the 4D array to a 2D array that has the desired
# block structure.
T.shape = (nrows*m, nh*n)

print(T)

印刷品
[[11 11  0  0  0  0]
 [11 11  0  0  0  0]
 [22 22 11 11  0  0]
 [22 22 11 11  0  0]
 [33 33 22 22 11 11]
 [33 33 22 22 11 11]
 [ 0  0 33 33 22 22]
 [ 0  0 33 33 22 22]
 [ 0  0  0  0 33 33]
 [ 0  0  0  0 33 33]]

(注意,结果不是toeplitz矩阵;它是block Toeplitz matrix

08-20 04:33