2017-05-16 25 views
0

Pythonで2次元関数の1次導関数を計算したいと思います。 Pythonの行列乗算の疎行列と密行列の違い

import numpy as np 
from matplotlib import pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
import scipy.sparse as scspar 

r_num = 10000 
r_vec = np.linspace(-10, 10, r_num) 
X_mat, Y_mat = np.meshgrid(r_vec, r_vec) 

x_square = lambda X, Y: np.exp(-np.power(X, 2)/2-np.power(Y, 2)/2) 
dh = abs(r_vec[1]-r_vec[0]) 

A = (np.eye(r_num)*(-30)+np.eye(r_num, k=-1)*(16)+np.eye(r_num, k=1)*(16)-np.eye(r_num, k=2)-np.eye(r_num, k=-2))/(12*dh*dh) 
C = (np.eye(r_num)*(-30)+np.eye(r_num, k=-1)*(16)+np.eye(r_num, k=1)*(16)-np.eye(r_num, k=-2)-np.eye(r_num, k=2))/(12*dh*dh) 
B = scspar.csc_matrix((np.eye(r_num)*-30+np.eye(r_num, k=-1)*16+np.eye(r_num, k=1)*16-np.eye(r_num, k=-2)-np.eye(r_num, k=2))/(12*dh*dh)) 
T = x_square(X_mat, Y_mat) 

plt.imshow(A-B) 
plt.show() 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.plot_surface(X_mat, Y_mat, T*B+(T.transpose()*B).transpose()) 
plt.show() 

今すぐ ABは、その一つは、スパースとして定義されている以外、同じであり、他の一つとして密行列:その目的のために、私は次のスクリプトを書きました。

T*A+(T.transpose()*A).transpose() 

でライン

T*B+(T.transpose()*B).transpose() 

を交換する場合でも、結果が大きく変化します。どうして?

答えて

0

同じ場合は同じ結果になるはずです。したがって、あなたはどこかで間違いを犯したと結論づけることができます。 scipy docsから

numpyのアレイへの類似性にもかかわらず、それは、が強く予想外につながる、numpyのは 適切な計算のためにそれらを変換していない可能性があるため、これらの行列に直接numpyの機能を使用するために をがっかりです(および が間違っています)結果。あなたはscipyのダウンロードが 与えられた疎行列クラスの独自の実装を持っている場合は、これらの 行列、最初のチェックにnumpyの機能を適用する、またはたToArrayを使用してnumpyの 配列(例えば(にスパース行列を変換しない場合)メソッド)をメソッドの適用前にまず適用します。

実際、ドキュメントでは、これらの疎行列にnumpy関数を使用せず、代わりにspecialized functions from scipyを使用して疎行列で操作するように指示しています。

+0

「B = scspar.csc_matrix(A)」を設定しているので、それらは等しいはずですか? –

+0

私は直接の経験はありませんが、等価演算子は過負荷になる可能性があります。私はちょうど確認した、そう、それはそうだ:https://github.com/scipy/scipy/blob/69170135bd5e5b1e9b4d712ca9a4307283780f14/scipy/sparse/base.py#L309 – JDong

+0

そしてそれは意味する? –