Как мне эффективно построить эту матрицу? - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть матрица A с размерностью (T,k). Я хочу построить следующую блочную матрицу для натуральных чисел m и t1, t2 < T:

\ begin {align *} \ begin {bmatrix} A [t_2,1] I_m & A [{t_2 -1}, 1] I_m & \ dots & A [{t_1}, 1] I_m \\ A [t_2,2 ] I_m & A [{t_2 -1}, 2] I_m & \ dots & A [{t_1}, 2] I_m \\ \ vdots \\ A [t_2, k] I_m & A [{t_2 -1}, k ] I_m & \ dots & A [{t_1}, k] I_m \ end {bmatrix} \ end {align *}

Здесь Im - единичная матрица измерения m, а A[t,i]Im - диагональная матрица со всеми диагональными элементами, равными A[t,i]. Есть ли эффективный способ написать это, возможно, без каких-либо петель? Вот мой текущий код (настройка t2 = t, t1 = 0), но он очень неэффективен

B = np.zeros([k*m,t*m]) 
for i in range(filter_count):
    for j in range(t): 
        B[i*m:(i+1)*m,j*m:(j+1)*m] = np.diag(np.repeat([A[t-j,i]],m))

1 Ответ

1 голос
/ 01 мая 2020

Попробуйте использовать продукт Kronecker fliplr(A) с eye(m), например:

import numpy as np

A = np.array([[1,2,3],[4,5,6]])
Im = np.eye(3)
R = np.kron(np.fliplr(A), Im)

print('A:\n', A)
print('Im:\n', Im)
print('R:\n', R)

, который печатает

A:
 [[1 2 3]
 [4 5 6]]
Im:
 [[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
R:
 [[3. 0. 0. 2. 0. 0. 1. 0. 0.]
 [0. 3. 0. 0. 2. 0. 0. 1. 0.]
 [0. 0. 3. 0. 0. 2. 0. 0. 1.]
 [6. 0. 0. 5. 0. 0. 4. 0. 0.]
 [0. 6. 0. 0. 5. 0. 0. 4. 0.]
 [0. 0. 6. 0. 0. 5. 0. 0. 4.]]
...