私のシステムは、対角スパース行列(ポアソン)によって最もよく記述されます。対角スパース行列がありますが、境界条件(つまり、行列の「エッジ」)をゼロに変更したいと思います。モデラーが明確な境界条件を持つスパース対角行列でシステムを記述したいというのは一般的な状況である必要がありますが、これを行うためのベストプラクティスはありますか?
[[0,0,0,0,..0],
[0,2,1,0,..0],
[0,1,2,1,..0],
...
[0,0,0,0,..0]]
私のシステムは、対角スパース行列(ポアソン)によって最もよく記述されます。対角スパース行列がありますが、境界条件(つまり、行列の「エッジ」)をゼロに変更したいと思います。モデラーが明確な境界条件を持つスパース対角行列でシステムを記述したいというのは一般的な状況である必要がありますが、これを行うためのベストプラクティスはありますか?
[[0,0,0,0,..0],
[0,2,1,0,..0],
[0,1,2,1,..0],
...
[0,0,0,0,..0]]
使用するスパース行列形式によって異なります。どうやらlil_matrix
、dok_matrix
スライスの割り当てを使用できます。
行列を効率的に作成するには、lil_matrix(推奨)またはdok_matrixのいずれかを使用します。lil_matrixクラスは、NumPy配列と同様の構文で、基本的なスライシングとファンシーインデックスをサポートします。
これはかなり簡単になります:
In : x = scipy.sparse.lil_matrix(np.ones((6,6)))
In : x.todense()
Out:
matrix([[ 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1.]])
In : x[:, 0] = 0
In : x[:, -1] = 0
In : x[0, :] = 0
In : x[-1, :] = 0
In : x.todense()
Out:
matrix([[ 0., 0., 0., 0., 0., 0.],
[ 0., 1., 1., 1., 1., 0.],
[ 0., 1., 1., 1., 1., 0.],
[ 0., 1., 1., 1., 1., 0.],
[ 0., 1., 1., 1., 1., 0.],
[ 0., 0., 0., 0., 0., 0.]])
PS:参考までに、あなたの行列は対角ではなく三重対角と呼ばれています。