Comment changer des éléments dans une matrice éparse dans SciPy de Python?
J'ai construit un petit code que je veux utiliser pour la résolution de problèmes aux valeurs propres problèmes impliquant de grandes matrices creuses. Ça fonctionne, tout ce que je veux faire maintenant est de définir certains éléments dans la matrice creuse à zéro, c'est à dire ceux dans le très haut de la ligne (qui correspond à la mise en œuvre de conditions aux limites). Je peux juste régler les vecteurs colonnes (C0, C1, C2) ci-dessous pour y parvenir. Cependant, je me demandais si il y a une façon plus directe. De toute évidence, NumPy l'indexation ne fonctionne pas avec SciPy éparses paquet.
import scipy.sparse as sp
import scipy.sparse.linalg as la
import numpy as np
import matplotlib.pyplot as plt
#discretize x-axis
N = 11
x = np.linspace(-5,5,N)
print(x)
V = x * x / 2
h = len(x)/(N)
hi2 = 1./(h**2)
#discretize Schroedinger Equation, i.e. build
#banded matrix from difference equation
C0 = np.ones(N)*30. + V
C1 = np.ones(N) * -16.
C2 = np.ones(N) * 1.
diagonals = np.array([-2,-1,0,1,2])
H = sp.spdiags([C2, C1, C0,C1,C2],[-2,-1,0,1,2], N, N)
H *= hi2 * (- 1./12.) * (- 1. / 2.)
#solve for eigenvalues
EV = la.eigsh(H,return_eigenvectors = False)
#check structure of H
plt.figure()
plt.spy(H)
plt.show()
C'est une visualisation de la matrice qui est à construire par le code ci-dessus. Je veux donc définir les éléments de la première ligne de zéro.
source d'informationauteur seb | 2013-04-09
Vous devez vous connecter pour publier un commentaire.
Comme suggéré dans les commentaires, je vais poster la réponse que j'ai trouvé à ma propre question. Il y a plusieurs matrice de classes dans SciPy éparses paquet, ils sont répertoriés ici. On peut convertir des matrices creuses à partir d'une classe à l'autre. Donc, pour ce que je dois faire, j'ai choisi de convertir mon sparse matrix à la classe csr_matrix, simplement par
Alors je peux définir les éléments de la première ligne à 0 à l'aide de l'ordinaire NumPy notation:
Pour être complet, je poste le plein modifié extrait de code ci-dessous.