矩阵必须分解成几个部分。首先,中间区域形成块对角矩阵,其中每个块是4x4 Toeplitz矩阵。
# makes a shifted diagonal matrix
def E(n, v, k):
return v * np.eye(n, k=k)
def toeplitz_block(n, v_list, k_list):
return sum(E(n, v, k) for v, k in zip(v_list, k_list))
然后我们可以执行以下操作:
n = 4 # size of block
m = 3 # how many blocks
# Make block diagonal matrix A
A = np.zeros((m, n, m, n))
u, v = np.diag_indices(m)
A[u, :, v, :] = toeplitz_block(n, [-1, 3, -1], [-1, 0, 1])
A = A.reshape(m * n, m * n)
print(A.astype(int))
# Output:
[[ 3 -1 0 0 0 0 0 0 0 0 0 0]
[-1 3 -1 0 0 0 0 0 0 0 0 0]
[ 0 -1 3 -1 0 0 0 0 0 0 0 0]
[ 0 0 -1 3 0 0 0 0 0 0 0 0]
[ 0 0 0 0 3 -1 0 0 0 0 0 0]
[ 0 0 0 0 -1 3 -1 0 0 0 0 0]
[ 0 0 0 0 0 -1 3 -1 0 0 0 0]
[ 0 0 0 0 0 0 -1 3 0 0 0 0]
[ 0 0 0 0 0 0 0 0 3 -1 0 0]
[ 0 0 0 0 0 0 0 0 -1 3 -1 0]
[ 0 0 0 0 0 0 0 0 0 -1 3 -1]
[ 0 0 0 0 0 0 0 0 0 0 -1 3]]
为了得到最终的期望矩阵,我们可以添加另一个对角线为-1的Toeplitz矩阵。
B = A + E(n * m, -1, -4)
print(B.astype(int))
# Output:
[[ 3 -1 0 0 0 0 0 0 0 0 0 0]
[-1 3 -1 0 0 0 0 0 0 0 0 0]
[ 0 -1 3 -1 0 0 0 0 0 0 0 0]
[ 0 0 -1 3 0 0 0 0 0 0 0 0]
[-1 0 0 0 3 -1 0 0 0 0 0 0]
[ 0 -1 0 0 -1 3 -1 0 0 0 0 0]
[ 0 0 -1 0 0 -1 3 -1 0 0 0 0]
[ 0 0 0 -1 0 0 -1 3 0 0 0 0]
[ 0 0 0 0 -1 0 0 0 3 -1 0 0]
[ 0 0 0 0 0 -1 0 0 -1 3 -1 0]
[ 0 0 0 0 0 0 -1 0 0 -1 3 -1]
[ 0 0 0 0 0 0 0 -1 0 0 -1 3]]