Zbudowałem mały kod, którego chcę użyć do rozwiązywania problemów wartości własnej z udziałem dużych rzadkich macierzy. Działa to dobrze, wszystko, co chcę teraz zrobić, to ustawić niektóre elementy w rzadkiej macierzy na zero, tj. Te w najwyższym rzędzie (co odpowiada implementacji warunków brzegowych). Mogę tylko dostosować wektory kolumn (C0, C1 i C2) poniżej, aby to osiągnąć. Zastanawiałem się jednak, czy istnieje bardziej bezpośredni sposób. Oczywiście indeksowanie NumPy nie działa z rzadkim pakietem SciPy.Jak zmienić elementy w rzadkiej macierzy w SciPy Pythona?
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()
Jest to wizualizacja macierzy zbudowanej na podstawie powyższego kodu. Chcę tak ustawić elementy w pierwszym wierszu zero.
Znalazłem pracę. Format, którego używam (dia_matrix) nie jest dobry, jeśli chcę, chcę go osiągnąć. Zamiast tego użyję csr_matrix. Czy powinienem wtedy zamknąć ten post? – seb
to dobrze napisane pytanie i może być przydatne dla innych osób w przyszłości. Co powiesz na umieszczenie tego, co znalazłeś jako odpowiedź? – YXD
ok, zrobię to – seb