私はPythonで行列を構築するときにいくつか問題があります。 各要素にループがあり、each element A_{ij}は図のような形をしています。ここでxはq要素の配列です(次のコードではxiで示されます)。Python:この行列を構築する際にループを回避し、行列の行列式をより速く計算するにはどうすればよいですか?
以下のコードを試しましたが、時間がかかりすぎます。私はそれがループの数のせいだと思うので、私はそれを2つの行列の積として見ていますが、ラムダは2つの次元を持っているので動作しませんでした。
これらのコードは機能として表示され、何度も使用されるため、高速化する方法はありますか?大変ありがとうございます!
def lambdak(i,j,alpha,rho):
return math.pi * alpha**2 * rho * math.exp(-math.pi**2 * alpha**2 *(i**2 + j**2))
def phik(i,j,x,alpha,rho):
return cmath.exp(2 * math.pi * 1j * (i*x[0] + j*x[1]))
alpha = 0.5
rho = 50
num = 30
x = np.random.uniform(-0.5,0.5,num)
y = np.random.uniform(-0.5,0.5,num)
xi = np.zeros((num,3))
for i in range(num):
xi[i] = np.array([x[i], y[i], 0])
q = len(xi)
A = [[np.sum(list(map(lambda j:
np.sum(list(map(lambda i:
lambdak(i,j,alpha,rho)/(1-lambdak(i,j,alpha,rho))* phik(i,j,xi[x]-xi[y],alpha,rho),
range(-N,N+1)))),
range(-N,N+1)))) for x in range(q)] for y in range(q)]
a = np.linalg.inv(A)
コードを調べるだけで、いくつかの提案をすることができます。 1)コンピューティングlambdak(i、j、alpha、rho)を別の関数で移動し、2D配列に格納することができます。 qごとに再計算する必要はありません。 2)また、このコードを並列化すると、それぞれの値を独立して計算できますが、PythonにはGILの制限があります。基本的には、たとえPythonでマルチスレッド化を実装しても、重要なspeedup.Butを見ることはありませんが、キャッシュのような微妙な最適化があります。 – skippy
@skippy thxそんなにあなたの答えに!私は最初の点を試してみましょう! –
@skippyしかし、あなたの2番目のポイントはもう少し説明できますか?私は "キャッシュ"を見てきましたが、私はそれに慣れていないので、私は完全にXOを失っています –