2013-04-09 3 views
12

큰 스파 스 행렬이 포함 된 고유 값 문제를 해결하기 위해 사용하려는 작은 코드를 만들었습니다. 괜찮 으면 좋겠어. 지금하고 싶은 것은 스파 스 행렬의 일부 요소를 0으로 설정하는 것입니다. 즉 맨 위에있는 행 (경계 조건 구현에 해당)에있는 요소를 설정하는 것입니다. 이를 달성하기 위해 열 벡터 (C0, C1 및 C2)를 조정할 수 있습니다. 그러나 나는 더 직접적인 방법이 있는지 궁금해했다. 분명히 NumPy 인덱싱은 SciPy의 희소 패키지에서 작동하지 않습니다.파이썬의 SciPy에서 스파 스 매트릭스의 요소를 변경하는 방법은 무엇입니까?

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() 

위의 코드로 빌드 한 행렬을 시각화 한 것입니다. 첫 번째 행의 요소를 0으로 설정하고 싶습니다. enter image description here

+0

해결 방법이 있습니다. 내가 사용하고자하는 형식 (dia_matrix)은 내가 원하는 것을 얻기에 좋지 않습니다. 나는 대신 csr_matrix를 사용할 것이다. 이 게시물을 닫아야합니까? – seb

+0

잘 쓰여진 질문이며 앞으로 다른 사람들에게 유용 할 수 있습니다. 당신이 답으로 찾은 것을 게시하는 것은 어떻습니까? – YXD

+0

좋아, 할게 – seb

답변

13

의견에 제안 된대로 내가 찾은 대답을 내 자신의 질문에 게시 할 것입니다. SciPy의 스파 스 패키지에는 매트릭스 클래스가 여러 개 있는데, 이들은 here입니다. 한 클래스에서 다른 클래스로 희소 행렬을 변환 할 수 있습니다. 내가 무엇을해야하는지, 나는 단순히

H = sp.csr_matrix(H) 

에 의해, 클래스 csr_matrix 내 희소 행렬을 변환하는 선택을 위해 그 때 나는 정규 NumPy와 표기법을 사용하여 0으로 첫 번째 행의 요소를 설정할 수 있도록 :

H[0,0] = 0 
H[0,1] = 0 
H[0,2] = 0 

완전성을 위해 아래에 전체 수정 코드 스 니펫을 게시합니다.

#SciPy Sparse linear algebra takes care of sparse matrix computations 
#http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html 
import scipy.sparse as sp 
import scipy.sparse.linalg as la 

import numpy as np 
import matplotlib.pyplot as plt 

#discretize x-axis 
N = 1100 
x = np.linspace(-100,100,N) 
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. 

H = sp.spdiags([C2, C1, C0, C1, C2],[-2,-1,0,1,2], N, N) 
H *= hi2 * (- 1./12.) * (- 1./2.) 
H = sp.csr_matrix(H) 
H[0,0] = 0 
H[0,1] = 0 
H[0,2] = 0 

#check structure of H 
plt.figure() 
plt.spy(H) 
plt.show() 

EV = la.eigsh(H,return_eigenvectors = False) 
+1

열보다 많은 행이있는 경우 csr은 빠르지 만 행보다 많은 열이있는 경우 csc가 빠릅니다. –

관련 문제