2017-01-04 16 views
1

私は現在、小さな有限要素シミュレーションを実装しています。 Python/Numpyを使用して、グローバル剛性行列を作成する効率的な方法を探しています。疎(剛性)行列の実行者作成

1)小さな要素剛性行列から疎行列を作成するには、coo_matrix()を使用する必要があります。ただし、既存のcoo_matrixを拡張することはできますか、またはi、j、vの最終リストから作成する必要がありますか?

2)現在、私は、リスト内包表記を使用して小さな要素剛性行列からiとjリストを作成し、それらを連結しています。これらのリストを作成するより良い方法はありますか?

3)データベクトルの作成:簡単な拡張の可能性のためにnumpyベクトルよりもPythonリストが優先されますか?

4)もちろん私は任意のアドバイスのために開いています:)。ありがとうございました!ここで

は私が意図するものを明確にするために、グローバルアセンブリを行うには、私の現在の計画の小さな例です。

この記事で
import numpy as np 
from scipy.sparse import coo_matrix 

#2 nodes, 3 dof per node 
locations = [0, 6] 
nNodes = 2 
dof =3 
totSize = nNodes * dof 
Ke = np.array([[1,1,1, 2,2,2], 
       [1,1,1, 2,2,2], 
       [1,1,1, 2,2,2], 
       [2,2,2, 3,3,3], 
       [2,2,2, 3,3,3], 
       [2,2,2, 3,3,3]]) 

I = [] 
J = [] 
#generate rowwise i and j lists: 
i = [ idx + u for i in range(totSize) for idx in locations for u in range(dof) ] 
j = [ idx + u for idx in locations for u in range(dof) for i in range(totSize) ] 
I += i 
J += J 

Data = Ke.flatten() 

cMatrix = coo_matrix((Data, (i,j)),) 
+0

こと。 – Divakar

+0

@Divakar huh?あなたはリストの理解の中で「私」を意味しますか? Python 3では、理解は漏れスコープを持っていません... –

+0

@ juanpa.arrivillagaああ、私は参照してください。うん、私はpython2.7で、その段階で 'i'に上書きしていました。 – Divakar

答えて

1

、私は、リストの作成に特有のパフォーマンス上の問題に焦点を当ててみますi,j、そして最後にマトリックスcMatrixである。

これらのループ/リストの理解の下では、基本的にはlocationsrange(dof)の要素ごとの加算を実行しています。 NumPyに移植すると、そこにbroadcastingを利用することができます。最後に、これらの解説でrange(totSize)のシミュレーションを再実行すると、tileの最終的な加算結果はnp.tileとなります。スパース行列の列にインデックスを付けるためのフラット化されたバージョンと、行の転置フラット化バージョンとして使用します。

したがって、実装は次のようになります - `計算行でi`は` j`は、前の行で計算されたi` `に上書き

idx0 = (np.asarray(locations)[:,None] + np.arange(dof)).ravel() 
J = np.tile(idx0[:,None],totSize) 
cMatrix = coo_matrix((Data, (J.ravel('F'),J.ravel())),)