Как мне сделать матрицу из матриц в python? (ValueError) - PullRequest
0 голосов
/ 05 апреля 2020

Итак, я хочу создать матрицу 2x2 H, в которой есть две матрицы, например:

Я не могу добавить изображения, поэтому нажмите здесь

Матрица в H должна быть матрицей dim x dim со значениями v в главной диагонали и значениями w в диагонали под главной диагональю.

Как это

Вот программа для этого:

def make_ham(v,w,dim):

    V = (scipy.sparse.eye(dim,k=0)*v).todense()   
    W = (scipy.sparse.eye(dim,k=-1)*w).todense() 

    Γ = V+W

    line = np.array([0,0,1,1])
    column = np.array([0,1,0,1])
    data = np.array([0,1,1,0]) 

    Hb = scipy.sparse.csc_matrix((data,(line,column)), shape=(2,2), dtype=(np.float64)) 


    H = kron(Hb, Γ)*[[1],[0]]+kron(Hb, Γ.T)*[[0],[1]]

    return H

Когда я даю дим, который не 2, я получаю эту ошибку:

ValueError: shapes (3,3) and (2,1) not aligned: 3 (dim 1) != 2 (dim 0)

Я действительно застрял здесь, так что спасибо в заранее за любой совет! :)

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Вот что вы можете сделать, используя numpy:

import numpy as np

#Size of the inside matrices
N = 2

#Setting values of v and w for instance
v = 1
w = 2

#Making H a diagonal matrix
H = np.eye(N)
np.where(H==1, v, H) #Replacing 0 values by v
np.where(H==0, w, H) #Replacing 0 values by w

#Filling the upper triangle with random values (For instance)
T = np.random.random((N, N))
T *= 1-np.tri(*T.shape)

#Redefining H with the upper triangle
H = H + T

#Creating a null matrix of the shape as H
Z = np.zeros_like(H)

#Creating matrix of matrix
matrix_of_matrix = np.array([[Z,H],[H.T,Z]])

print(matrix_of_matrix)
0 голосов
/ 05 апреля 2020

Вам не нужно использовать sparse. np.eye имеет параметр смещения k. И создание (2,2) Hb является тривиальной задачей:

In [89]: v,w=2,3                                                                        
In [90]: Γ = np.eye(10,k=0)*v+np.eye(10,k=-1)*w                                                
In [91]: Γ                                                                                     
Out[91]: 
array([[2., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [3., 2., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 3., 2., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 3., 2., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 3., 2., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 3., 2., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 3., 2., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 3., 2., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 3., 2., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 3., 2.]])
In [92]: Hb = np.array([[0,1],[1,0]])                                                          
In [93]: Hb                                                                                    
Out[93]: 
array([[0, 1],
       [1, 0]])
In [94]: np.kron(Hb, Γ)                                                                        
Out[94]: 
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2., 0., 0., 0., 0., 0.,
        0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 3., 2., 0., 0., 0., 0.,
        0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 3., 2., 0., 0., 0.,
        0., 0., 0., 0.],
       ....
       [0., 0., 0., 0., 0., 0., 0., 0., 3., 2., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0.]])
In [95]: _.shape                                                                               
Out[95]: (20, 20)

sparse.kron(Hb, Γ) с вашим разреженным Hb должно давать то же самое, но в качестве разреженной матрицы.

Из сообщения об ошибке я подозреваю, что kron(Hb, Γ)*[[1],[0]] пытается получить матричный продукт. Хотя второй аргумент явно (2,1), я не понимаю, почему первый, kron() равен (3,3). В любом случае явно существует несоответствие форм, будь то матричный продукт, поэлементный продукт, разреженный или плотный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...