Как создать большую трехдиагональную матрицу с помощью матриц?

#python #arrays #matrix #reshape #diagonal

#python #массивы #матрица #изменить форму #диагональная

Вопрос:

Как я могу создать матрицу H из двух меньших матриц H_0 и H_1, как показано на прилагаемом изображении? Конечное измерение конечно.

введите описание изображения здесь

Ответ №1:

Вот пример.

 a = np.array([[1,2,3],[4,5,6]])
b = np.ones(shape=(3,3))
a_r = a.reshape((-1,))
b_r = b.reshape((-1,))
b_r_ = np.diag(b_r,k=1)

b_r_ = b_r_   b_r_.transpose()

for i in range(b_r_.shape[0]):
  
  if i < len(a_r):
    b_r_[i][i]=a_r[i]

  else:
    b_r_[i][i]=0
 

Вывод:

 array([[1., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
       [1., 2., 1., 0., 0., 0., 0., 0., 0., 0.],
       [0., 1., 3., 1., 0., 0., 0., 0., 0., 0.],
       [0., 0., 1., 4., 1., 0., 0., 0., 0., 0.],
       [0., 0., 0., 1., 5., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 6., 1., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1., 0., 1., 0.],
       [0., 0., 0., 0., 0., 0., 0., 1., 0., 1.],
       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.]])
 

Беспокойство:
Я думаю, что это не самый эффективный с точки зрения вычислений способ, но я думаю, что он работает

Комментарии:

1. Это не то, что я имел в виду. H_0 и H_1 являются матрицами. Скажем, H_0 — это матрица m x m. Первый блок m x m блока H должен быть равен H_0 . Если H_1 также равно m x m; второй горизонтальный блок H должен содержать H_1 (от строк m 1 до 2m, столбцов от 1 до m).

2. Это звучит как наложение двух матриц друг на друга. Я правильно понял?

Ответ №2:

 H = np.kron(np.eye(r,dtype=int),H_0)   np.kron(np.diag(np.ones(r-1), 1),H_1)   np.kron(np.diag(np.ones(r-1), -1),transpose(conj(H_1))) #r = repetition